calling super class init when child class is created using type()
我尝试使用python type()方法动态创建一个类。
所以,假设我有一个"A"类的基类
1 2 3 | >>> class A: def __init__(self): print("I am in init of A..") |
现在我用type方法创建了一个子类"c"
1 | >>> C = type('C',(A,),{}) |
号
当我创建一个对象时
1 2 | >>> c = C() I am in init of A.. |
基类的init也被正确调用。
现在我想在init方法中做一些事情,并编写一个自定义init方法。
1 2 | >>> def BsInit(self): print ("I am in init of B..") |
。
我创建了一个类"b"并创建了一个实例。
1 2 3 | >>> B = type('B',(A,),{'__init__':BsInit}) >>> b = B() I am in init of B.. |
根本没有调用类A的init。
所以尝试这样修改bsinit方法:
1 2 3 | >>> def BsInit(self): super().__init__(); print ("I am in init of B..") |
。
当我创建一个实例时,我会得到下面的错误…
1 2 3 4 5 6 7 8 | >>> B = type('B',(A,),{'__init__':BsInit}) >>> b = B() Traceback (most recent call last): File"<pyshell#21>", line 1, in <module> b = B() File"<pyshell#19>", line 2, in BsInit super().__init__();print ("I am in init of B..") RuntimeError: super(): __class__ cell not found |
。
我在使用type()的自定义init中找到的所有示例都非常简单,就像初始化一个变量一样。但是如果我也要调用基类init,怎么做呢??
你应该这样称呼它:
您需要在init方法中传递cls而不是self。下面是您的问题的解决方案:
1 2 3 4 5 6 | def init(cls): super(type(cls), cls).__init__() B = type('B',(A,),{'__init__':init}) b = B() "I am in init of A.." |