使用super的动态类继承

时间:2015-12-07 20:46:44

标签: python-3.x object inheritance superclass

我尝试使用type()动态创建一个类,并分配一个调用__init__的{​​{1}}构造函数;但是,当super().__init__(...)被调用时,我收到以下错误:

super()

这是我的代码:

TypeError: super(type, obj): obj must be an instance or subtype of type

为什么class Item(): def __init__(self, name, description, cost, **kwargs): self.name = name self.description = description self.cost = cost self.kwargs = kwargs class ItemBase(Item): def __init__(self, name, description, cost): super().__init__(name, description, cost) def __constructor__(self, n, d, c): super().__init__(name=n, description=d, cost=c) item = type('Item1', (ItemBase,), {'__init__':__constructor__}) item_instance = item('MyName', 'MyDescription', 'MyCost') 方法中的super()不理解对象参数;以及如何修复它?

2 个答案:

答案 0 :(得分:2)

以下是我解决问题的方法。我引用type()方法来动态地实例化具有变量引用的类:

def __constructor__(self, n, d, c, h):
    # initialize super of class type
    super(self.__class__, self).__init__(name=n, description=d, cost=c, hp=h)

# create the object class dynamically, utilizing __constructor__ for __init__ method
item = type(item_name, (eval("{}.{}".format(name,row[1].value)),), {'__init__':__constructor__})
# add new object to the global _objects object to be used throughout the world
self._objects[ item_name ] = item(row[0].value, row[2].value, row[3].value, row[4].value)

可能有更好的方法可以实现这一目标,但我需要修复,这就是我想出来的......如果可以,请使用它。

答案 1 :(得分:1)

请注意,如果动态创建的类被继承为self.__class__,则sadmicrowave的解决方案将产生一个无限循环。

没有此问题的另一种方法是在创建类后分配__init__,例如可以通过闭包显式链接该类。示例:

# Base class
class A():
  def __init__(self):
    print('A')

# Dynamically created class
B = type('B', (A,), {})

def __init__(self):
  print('B')
  super(B, self).__init__()

B.__init__ = __init__

# Child class
class C(B):
  def __init__(self):
    print('C')
    super().__init__()


C()  # print C, B, A