链式调用Python中的父构造函数

考虑这个 – 一个基类A,从Binheritance的类B,从Binheritance的类C.什么是在构造函数中调用父类构造函数的通用方法? 如果这仍然听起来太模糊,这是一些代码。

class A(object): def __init__(self): print "Constructor A was called" class B(A): def __init__(self): super(B,self).__init__() print "Constructor B was called" class C(B): def __init__(self): super(C,self).__init__() print "Constructor C was called" c = C() 

这是我现在做的。 但是它看起来还是非常通用的 – 你仍然必须手工传递正确的types。

现在,我已经尝试使用self.__class__作为super()的第一个参数,但显然这不起作用 – 如果将它放在C的构造函数中,那么B的构造函数会被调用。 如果你在B中做同样的事情,“self”仍然指向C的一个实例,所以你最终再次调用B的构造函数(这以无限recursion结束)。

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

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

这个类是否被明确地传递给super是一个风格问题而不是function问题。 传递类super符合Python的“明显优于隐式”的哲学。

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

 super().__init__(args) 

你可以简单地写:

 class A(object): def __init__(self): print "Constructor A was called" class B(A): def __init__(self): A.__init__(self) # A.__init__(self,<parameters>) if you want to call with parameters print "Constructor B was called" class C(B): def __init__(self): # A.__init__(self) # if you want to call most super class... B.__init__(self) print "Constructor C was called"