关于python:使用type()创建子类时调用超类init

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,怎么做呢??


你应该这样称呼它:super(B, self).__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.."