钻石的问题
class BaseClass:
num_base_calls = 0
def call_me(self):
print("Base Class")
BaseClass.num_base_calls += 1
class LeftSubclass(BaseClass):
num_left_calls = 0
def call_me(self):
BaseClass.call_me(self)
print("Left Class")
LeftSubclass.num_left_calls += 1
class RightSubclass(BaseClass):
num_right_calls = 0
def call_me(self):
BaseClass.call_me(self)
print("Right Class")
RightSubclass.num_right_calls += 1
class Subclass(LeftSubclass,RightSubclass):
num_sub_calls = 0
def call_me(self):
LeftSubclass.call_me(self)
RightSubclass.call_me(self)
print("Sub Class")
Subclass.num_sub_calls += 1
执行结果:
C:\Users\39621>python -i d:\2019\py1.py
>>> s=Subclass()
>>> s.call_me()
Base Class
Left Class
Base Class
Right Class
Sub Class
BaseClass的call_me方法被调用了两次。
解决方法super().call_me()
class BaseClass:
num_base_calls = 0
def call_me(self):
print("Base Class")
BaseClass.num_base_calls += 1
class LeftSubclass(BaseClass):
num_left_calls = 0
def call_me(self):
super().call_me()
print("Left Class")
LeftSubclass.num_left_calls += 1
class RightSubclass(BaseClass):
num_right_calls = 0
def call_me(self):
super().call_me()
print("Right Class")
RightSubclass.num_right_calls += 1
class Subclass(LeftSubclass,RightSubclass):
num_sub_calls = 0
def call_me(self):
super().call_me()
print("Sub Class")
Subclass.num_sub_calls += 1
执行结果:
C:\Users\39621>python -i d:\2019\py1.py
>>> s=Subclass()
>>> s.call_me()
Base Class
Right Class
Left Class
Sub Class
Subclass的call_me()调用了super().call_me(),其实就是引用了LeftSubclass.call_me();
然后LeftSubclass.call_me()调用了super().call_me(),但这时super()引用了RightSubclass.call_me()