首页 文章

python中的链调用父构造函数[重复]

提问于
浏览
262

这个问题在这里已有答案:

考虑一下 - 基类A,继承自A的类B,继承自B的类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()

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

现在,我已经尝试使用 self.__class__ 作为super()的第一个参数,但是,显然它没有't work - if you put it in the constructor for C - fair enough, B'的构造函数被调用 . 如果你在B中做同样的事情,"self"仍然指向一个C的实例,所以你最终再次调用B的构造函数(这以无限递归结束) .

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

3 回答

  • 24

    你可以简单地写:

    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"
    
  • 175

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

    是否将类显式传递给 super 的问题是样式而不是功能问题 . 将类传递给 super 符合Python的"explicit is better than implicit"哲学 .

  • 161

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

    super().__init__(args)
    

相关问题