gpt4 book ai didi

python - Python 中的混合继承

转载 作者:行者123 更新时间:2023-12-04 09:29:38 26 4
gpt4 key购买 nike

我正在尝试在 python 中实现多重混合继承,它也给出了答案,但我想知道答案序列背后的原因是什么,对于这段代码:

class GrandPa:
def __init__(self):
print("Grand Pa")

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

class Mother(GrandPa):
def __init__(self):
super().__init__()
print("Mother")


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

c = child()
输出
Grand Pa
Mother
Father
Child
在child类中我们已经在mother之前上过Father类,所以不是应该在Mother之前打印Father吗?这个序列背后有什么逻辑吗?

最佳答案

您可以随时咨询 __mro__ 找出发生了什么:

print(c.__class__.__mro__)
# (<class '__main__.child'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.GrandPa'>, <class 'object'>)
确实 Father来之前 Mother在这个链条中。
但是,当您像这样链接调用时,实际会发生这种情况:
class GrandPa:
def __init__(self):
print("Grand Pa")

class Father(GrandPa):
def __init__(self):
print('f', super())
super().__init__()
print("Father")

class Mother(GrandPa):
def __init__(self):
print('m', super())
super().__init__()
print("Mother")


class child(Father, Mother):
def __init__(self):
print('c', super())
super().__init__()
print("Child")

c = child()
我已添加 print(super())到所有方法来说明调用堆栈内部发生的事情:
c <super: <class 'child'>, <child object>>
f <super: <class 'Father'>, <child object>>
m <super: <class 'Mother'>, <child object>>
Grand Pa
Mother
Father
Child
如您所见,我们从 Child 开始,然后转到 Father ,然后到 Mother ,只有在那之后 GrandPa被执行。然后控制流返回到 Mother只有在它转到 Father 之后再次。
在现实生活用例中,不建议过度使用多重继承。这可能是一个巨大的痛苦。组合和混合更容易理解。

关于python - Python 中的混合继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62895004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com