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

时间:2016-05-09 14:13:21

标签: python multiple-inheritance method-resolution-order

我正在阅读有效的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的值为275 * 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吗?

1 个答案:

答案 0 :(得分:2)

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

首先调用TimesFiveCorrect 。但是,它首先要做的是调用super方法,该方法解析为PlusTwoCorrect;然后调用超级方法,该方法解析为MyBaseClass。只有当这些方法都返回时,值才会发生变异并且打印语句会发生。

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