父级初始化程序未在多级继承中调用?

Yar*_*rin 2 python inheritance initialization

我有一个具有2级继承的类方案.我的期望是每个类构造函数都会运行 - 然而中级类构造函数似乎永远不会被击中.这里缺少什么?

class Base(object):
    def __init__(self):
        print "BASE"

class Next(Base):
    def __init__(self):
        super(Base, self).__init__()
        print "NEXT"

class Final(Next):
    def __init__(self):
        super(Next, self).__init__()    
        print "FINAL"

f = Final()
Run Code Online (Sandbox Code Playgroud)

输出:

基地
决赛

为什么"NEXT"不打印?

Amb*_*ber 10

你应该super()当前的类调用,而不是父类.

class Base(object):
    def __init__(self):
        super(Base, self).__init__()
        print "BASE"

class Next(Base):
    def __init__(self):
        super(Next, self).__init__()
        print "NEXT"

class Final(Next):
    def __init__(self):
        super(Final, self).__init__()    
        print "FINAL"

f = Final()
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎是多余的("为什么它不能从类中获取self?") - 但请记住,在创建时self,这些__init__方法都会传递给所有这三个方法f,并且self始终是类Final.因此,您必须传递super()您希望它找到父类的类.

  • 值得注意的是,Python 3.x允许您以简单的方式执行此操作,只需执行`super().__ init __()`. (2认同)
  • 它不仅仅是人们修改对象的时候.还有更多的情况,如果没有调用基础上的super()会违反mro查找,请参阅http://fuhm.net/super-harmful/ (2认同)