python中链式调用父初始化器

考虑一下——基类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的初始化式(这以无限递归结束)。

目前没有必要考虑钻石继承的问题,我只是对解决这个具体问题感兴趣。

177597 次浏览

你这样做确实是推荐的(对于Python 2.x)。

类是否显式传递给super的问题是一个风格问题,而不是功能问题。将类传递给super符合Python“显式优于隐式”的哲学。

Python 3包含了改进的super(),允许像这样使用:

super().__init__(args)

你可以简单地写:

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"