什么时候使用 Parent.__init__(self) 什么时候不使用它?

When to use Parent.__init__(self) and not to use it?

我有这个代码:

class Pere():
    def __init__(self, nom):
        self.nom = nom
    def yeux(self):
        print 'les yeux bleus'

class Mere():
    def __init__(self, nom):
        self.nom = nom
    def taille(self):
       print 'je suis longue!'

class Enfant(Pere, Mere):
    pass

并且在一些谈到 inheritance 的教程中,他们使用 ParentClass.__init__(self, *args) 作为子构造函数。

这是使用它的例子:

class Person(object):
    def __init__(self, nom, age):
        self.name = nom
        self.age = age
    def __str__(self):
        return 'je suis {0}, et j\'ai {1} ans'.format(self.name, self.age)

class Militaire(Person):
    def __init__(self, nom, age, grade):
        Person.__init__(self, nom, age)
        self.grade = grade
    def __str__(self):
        return Person.__str__(self) + ' et je suis un {0}'.format(self.grade)

什么时候使用它?

在多重继承中,我们不需要它(例如如果有就写两次)?

未绑定方法调用 (Parent.__init__(self, ...)) 通常不能很好地工作 多重继承 -- 就像简单地继承 __init__ (如果委派父级是你在你的子class方法中所做的一切,不要 - 只是省略在子class中定义方法所以它继承来自超级class).

在您的示例中,这完全没有实际意义,因为两个超级classes 都具有相同的 __init__ 实现(在原始 Q 中,现在进行了编辑以更改它),所以这并不重要你知道。

更一般地说,这就是引入 super 的目的——它在 Python 3 中运行顺畅,在 Python 2 中运行稍差(在后一种情况下,仅适用于新的-style classes,通常继承自 object——但是没有人应该再定义旧式 classes!-),但它仍然适用于多重继承比较旧的方法,例如显式调用 Parent.__init__(不过,只有在层次结构中的每个 class 都合作时它才有效)。

有关 super 等的更多信息,请参阅 Understanding Python super() with __init__() methods