dpq
dpq

Reputation: 9268

Dynamically set inheritance in Python

I have class A that is supposed to inherit class B whose name is not yet known at the time of A being written. Is it possible to declare A not inheriting anything, and add B as the base class during A's instantiation? Example:

First file

class B:
  def __init__(self):
    self.__name = "Class B"

  def name(self):
    return self.__name

Second file

class A:
  def __init__(self):
    self.__name = "Class A"

# At some point here, the appropriate module name and location is discovered
import sys
sys.path.append(CustomModulePath)
B = __import__(CustomModuleName)

magic(A, B) # TODO What should magic() do?

a = A()
print a.name() # This will now print "Class A", since name() is defined in B.

Upvotes: 1

Views: 239

Answers (1)

Rakis
Rakis

Reputation: 7864

Yeah, you can accomplish this with metaclasses. It's not the easiest topic to wrap your head around but it'll do the job. There's a Stack Overflow question about them that looks like it has some good information and I also found an IBM article that might help as well. Somewhere in the official Python documentation, there's a section about them but I can't recall exactly where offhand.

Upvotes: 2

Related Questions