为什么 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()
无论如何都会让人感到困惑。
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()
无论如何都会让人感到困惑。