python中的链调用父初始化器

时间:2009-05-24 15:54:10

标签: python oop inheritance constructor

考虑这一点 - 基类A,B类继承自A,C类继承自B。在初始化程序中调用父类初始化程序的通用方法是什么?如果这仍然听起来太模糊,这里有一些代码。

class A(object):
    def __init__(self):
        print "Initialiser A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Initialiser B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Initialiser C was called"

c = C()

这就是我现在的表现。但它仍然看起来有点过于非泛型 - 您仍然必须手动传递正确的类型。

现在,我尝试使用self.__class__作为super()的第一个参数,但是,显然它不起作用 - 如果你把它放在C的初始化中 - 公平,B的初始值被调用。如果你在B中做同样的事情,“self”仍然指向C的实例,所以你最终再次调用B的初始化器(这以无限递归结束)。

现在没有必要考虑钻石继承,我只想解决这个具体问题。

3 个答案:

答案 0 :(得分:185)

Python 3包含一个改进的super(),允许使用如下:

super().__init__(args)

答案 1 :(得分:163)

你的方式确实是推荐的(对于Python 2.x)。

是否将类明确传递给super的问题是风格问题而不是功能问题。将类传递给super符合Python的“显式优于隐式”的理念。

答案 2 :(得分:25)

您可以简单地写:

class A(object):

    def __init__(self):
        print "Initialiser A was called"

class B(A):

    def __init__(self):
        A.__init__(self)
        # A.__init__(self,<parameters>) if you want to call with parameters
        print "Initialiser B was called"

class C(B):

    def __init__(self):
        # A.__init__(self) # if you want to call most super class...
        B.__init__(self)
        print "Initialiser C was called"