使用 super 的动态 class 继承
dynamic class inheritance using super
我正在尝试使用 type()
动态创建 class 并分配调用 super().__init__(...)
的 __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()
方法里面的__constructor__
不理解对象参数;我该如何解决?
这是我解决问题的方法。我引用 type()
方法来动态实例化具有变量引用的 class:
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)
可能有更好的方法来完成此操作,但我需要一个修复程序,这就是我想出的...如果可以,请使用它。
请注意,如果动态创建的 class 被继承,sadmicrowave 的解决方案会创建一个无限循环,因为 self.__class__
将对应于子 class。
另一种不存在此问题的方法是在创建 class 之后分配 __init__
,例如 class 可以通过闭包显式链接。示例:
# 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
我正在尝试使用 type()
动态创建 class 并分配调用 super().__init__(...)
的 __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()
方法里面的__constructor__
不理解对象参数;我该如何解决?
这是我解决问题的方法。我引用 type()
方法来动态实例化具有变量引用的 class:
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)
可能有更好的方法来完成此操作,但我需要一个修复程序,这就是我想出的...如果可以,请使用它。
请注意,如果动态创建的 class 被继承,sadmicrowave 的解决方案会创建一个无限循环,因为 self.__class__
将对应于子 class。
另一种不存在此问题的方法是在创建 class 之后分配 __init__
,例如 class 可以通过闭包显式链接。示例:
# 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