关于oop:有没有办法使用super()来调用Python中每个基类的__init__方法?

Is there a way to use super() to call the __init__ method of each base class in Python?

假设我有一些Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Mother:
    def __init__(self):
        print("Mother")

class Father:
    def __init__(self):
        print("Father")

class Daughter(Mother, Father):
    def __init__(self):
        print("Daughter")
        super().__init__()

d = Daughter()

这个剧本印的是"女儿"。是否有任何方法可以确保调用基类的所有 init 方法?我想出的一个方法是:

1
2
3
4
5
class Daughter(Mother, Father):
    def __init__(self):
        print("Daughter")
        for base in type(self).__bases__:
            base.__init__(self)

这个剧本印的是"女儿"、"母亲"、"父亲"。使用super()或其他方法是否有很好的方法?


Raymond Hettinger在2015年的Pycon演讲中非常好地解释了这一点。简短的回答是"是",如果您这样设计,并在每个类中调用super().__init__()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Mother:
    def __init__(self):
        super().__init__()
        print("Mother")

class Father:
    def __init__(self):
        super().__init__()
        print("Father")

class Daughter(Mother, Father):
    def __init__(self):
        super().__init__()
        print("Daughter")

super这个名字很不幸,它实际上是通过基类工作的。