为什么 super() 只调用 class Parent1 的构造函数而不调用 class Parent2 的构造函数?

Why super() is calling constructor of class Parent1 only and not calling constructor of class Parent2?

class Parent1:
    def __init__(self):
        self.data1 = 10
        print("parent1")

class Parent2:
    def __init__(self):
        self.data2 = 20 
        print("parent2")

class child(Parent2,Parent1):
    def __init__(self):
        print("this is child class")
        super().__init__()
        print(self.data1)
        print(self.data2)
        
obj = child()

输出:

this is child class
parent2
Traceback (most recent call last):
  File "f:/Project2020/Rough Work/rough2.py", line 18, in <module>
    obj = child()
  File "f:/Project2020/Rough Work/rough2.py", line 15, in __init__
    print(self.data1)
AttributeError: 'child' object has no attribute 'data1'

回答你的问题:在python中有一个继承链。在你的例子中,这个继承链看起来像 [Child, Parent2, Parent1],
所以对于 python 编译器来说,没有多重继承这样的东西。 super() 只是在继承链上向上走一步的简写。因此,您的陈述等于 Parent2.__init__(),实际上 super().__init__() 调用了 Parent2.__init__()
所以你还需要调用 Parent1.__init__() from class Child.

我建议写:

class Parent1:
    def __init__(self):
        self.data1 = 10
        print("parent1")

class Parent2:
    def __init__(self):
        self.data2 = 20 
        print("parent2")

class Child(Parent2,Parent1):
    def __init__(self):
        print("this is child class")
        Parent2.__init__(self)
        Parent1.__init__(self)
        print(self.data1)
        print(self.data2)

在这种情况下,如果不使用 super(),代码会更清晰。这段代码可能看起来很奇怪,但在这里使用 super() 无论如何都会让人感到困惑。