gpt4 book ai didi

python - 使用新样式类的多重继承时如何确定执行顺序?

转载 作者:行者123 更新时间:2023-12-01 03:57:53 25 4
gpt4 key购买 nike

我正在阅读《Effective Python》一书,我发现了以下代码

class MyBaseClass(object):
def __init__(self, value):
self.value = value
print "I changed it to MyBaseClass",self.value

class TimesFiveCorrect(MyBaseClass):
def __init__(self, value):
super(TimesFiveCorrect, self).__init__(value)
self.value *= 5
print "I changed it to TimesFiveCorrect ",self.value

class PlusTwoCorrect(MyBaseClass):
def __init__(self, value):
super(PlusTwoCorrect, self).__init__(value)
self.value += 2
print "I changed it to PlusTwoCorrect ",self.value

class Factor(TimesFiveCorrect, PlusTwoCorrect):
def __init__(self, value):
super(Factor, self).__init__(value)
print "I changed it to Factor ",self.value

foo = Factor(5)
from pprint import pprint
pprint(Factor.mro())

我期望 foo 的值是 27 (5 * 5 + 2)。但结果是35。输出如下

I changed it   to MyBaseClass 5
I changed it to PlusTwoCorrect 7
I changed it to TimesFiveCorrect 35
I changed it to Factor 35
[<class '__main__.Factor'>,
<class '__main__.TimesFiveCorrect'>,
<class '__main__.PlusTwoCorrect'>,
<class '__main__.MyBaseClass'>,
<type 'object'>]

我可以理解 MRO,但我没有得到执行顺序...不应该首先调用 TimesFiveCorrect 吗?

最佳答案

但 MRO 是执行顺序,您的打印输出会解释发生了什么。

首先调用

TimesFiveCorrect。然而,它做的第一件事是调用 super 方法,该方法解析为 PlusTwoCorrect;依次调用其 super 方法,该方法解析为 MyBaseClass。只有当这些方法全部返回时,值才会发生变化并且打印语句才会发生。

如果您想要 27 的结果,您可以将 super() 调用移至每个方法的end。然后,在调用 super 方法之前,首先会发生突变和打印。

关于python - 使用新样式类的多重继承时如何确定执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37118032/

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