使用type()创建子类时调用超类init

时间:2017-06-09 05:41:23

标签: python python-3.x

我正在尝试使用python type()方法动态创建一个类。

所以,说我有一个基类'A'

>>> class A:
    def __init__(self):
        print("I am in init of A..")

现在我使用类型方法

创建子类'C'
>>> C = type('C',(A,),{})

当我创建一个对象时

>>> c = C()
I am in init of A..

也正确调用基类的init ..

现在我想在我的init方法中做一些事情并编写一个自定义的init方法..

>>> def BsInit(self):
    print ("I am in init of B..")

我创建一个类'B'并创建一个实例..

>>> B = type('B',(A,),{'__init__':BsInit})
>>> b = B()
I am in init of B..

A类的初始化根本没有被调用..

所以试图像这样修改BsInit方法:

>>> def BsInit(self):
    super().__init__();
    print ("I am in init of B..")

当我创建一个实例时,我得到以下错误...

>>> 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也是如何做到的?

2 个答案:

答案 0 :(得分:2)

你需要这样称呼它:super(B, self).__init__()

答案 1 :(得分:1)

你需要在init方法而不是self中传递cls。以下是您的问题的解决方案:

def init(cls):
    super(type(cls), cls).__init__()

B = type('B',(A,),{'__init__':init})
b = B()
"I am in init of A.."