Python 为什么可以调用超类没有的方法

Python 为什么可以调用超类没有的方法,python,python-2.7,multiple-inheritance,superclass,method-resolution-order,Python,Python 2.7,Multiple Inheritance,Superclass,Method Resolution Order,我正在阅读用Python2.7实现paxos算法的源代码。在代码中,有很多方法调用超类的方法,而超类中没有这个方法,这两个方法的名称总是相同的。这是Python的一个特殊特性吗? 超级(SimpleSynchronizationStrategyMixin,self)。设置信使(信使) SimpleSynchronizationStrategyMixin的超类是不包含方法“set_messenger”的对象。这行代码所属的方法的确切名称也是“set_messenger” 类SimpleSynchr

我正在阅读用Python2.7实现paxos算法的源代码。在代码中,有很多方法调用超类的方法,而超类中没有这个方法,这两个方法的名称总是相同的。这是Python的一个特殊特性吗? 超级(SimpleSynchronizationStrategyMixin,self)。设置信使(信使) SimpleSynchronizationStrategyMixin的超类是不包含方法“set_messenger”的对象。这行代码所属的方法的确切名称也是“set_messenger”

类SimpleSynchronizationStrategyMixin(对象):
同步延迟=10.0
def设置_信使(自身、信使):
超级(SimpleSynchronizationStrategyMixin,self)。设置信使(信使)
def sync():
self.messenger.send\u sync\u请求(随机选择(self.peers)、self.instance\u编号)
self.sync_task=task.LoopingCall(sync)
self.sync\u任务.启动(self.sync\u延迟)
def接收同步请求(自身、来自uid、实例号):
如果实例编号self.instance\u编号:
打印“已同步:”,实例号,当前值
self.advance\u实例(实例号,当前值,catchup=True)

您发布的代码看起来确实很奇怪,单独使用这个类确实会失败。例如,使用以下最小示例:

类SimpleSynchronizationStrategyMixin(对象):
def设置_信使(自身、信使):
超级(SimpleSynchronizationStrategyMixin,self)。设置信使(信使)
打印(‘测试’)
测试=SimpleSynchronizationStrategyMixin()
测试。设置通讯器(无)
将给出一个错误,如您所料:

AttributeError:“super”对象没有属性“set\u messenger”
然而,类的名称揭示了答案:它是一个“mixin”类,一个打算与另一个类混合的类。因此,该类只添加了某些功能,并且可能会对超级对象中存在的方法做出假设(对于最终对象而言,超级对象是而不是

为了演示这一点,让我们用以下代码扩展上述示例:

class-SomeOtherClass(对象):
def设置_信使(自身、信使):
打印('将messenger设置为%s.%repr(messenger))
类演示(SimpleSynchronizationStrategyMixin,SomeOther类):
def演示(自我):
self.set\u messenger(“某个messenger”)
demo=demo()
demo.demo()
这里,
set\u messenger
方法在
SomeOtherClass
中定义。然后,
Demo
类使用带有mixin的
SomeOtherClass
创建最终对象。调用
demo()
时,它会打印:

将messenger设置为“某个messenger”。
测试
请注意,超类的顺序很重要。如果要编写
类Demo(其他类,SimpleSynchronizationStrategyMixin)
,则不会打印“test”行

有关特定的paxos示例,请参见
server.py
,其中包含:

class ReplicatedValue(专用MasterStrategyMixin、指数打包ResolutionsStrategyMixin、SimpleSynchronizationStrategyMixin、BaseReplicatedValue):
"""
将专用的主、解析和同步策略混合到基类中
""
在这里,您可以看到许多mixin类被“添加”到
BaseReplicatedValue
以创建
ReplicatedValue

请注意,
super()
并不总是返回“父”对象。如果方法
indivatedMasterStrategyMixin.propose\u update(self…)
调用
super(indivatedMasterStrategyMixin,self)。propose\u update(…)
,它将查找下一个
propose\u update()
方法根据。简单地说,它从左到右查找所有基类,并返回找到的第一个方法。这样,每个方法都可以调用
super()
,而不知道哪个类是“父类”,因此仍然可以链接所有必需的方法。下面的示例代码演示了这一点:

类基(对象):
def测试(自我):
#注意:基类中没有super()调用!
打印('测试库')
打印(“”)
类MixinX(对象):
def测试(自我):
打印('测试X')
super(MixinX,self).test()
类混合(对象):
def测试(自我):
打印('测试Y')
super(MixinY,self).test()
类MixinZ(对象):
def测试(自我):
打印('测试Z')
super(MixinZ,self).test()
期末班(基本班):
通过
类FinalX(MixinX,基):
通过
类FinalXYZ(MixinX、MixinY、MixinZ、Base):
通过
类FinalZYX(MixinZ、MixinY、MixinX、Base):
通过
类错误顺序(基本、混合、混合、混合):
通过
类MixinsOnly(MixinX、MixinY、MixinZ):
通过
"""
>>>Final().test()
试验基地
>>>FinalX().test()
测试X
试验基地
>>>FinalXYZ().test()
测试X
测试Y
测试Z
试验基地
>>>FinalZYX.test()
测试Z
测试Y
测试X
试验基地
>>>错误顺序().test()
试验基地
>>>mixensonly().test()
测试X
测试Y
测试Z
回溯(最近一次呼叫最后一次):
文件“superdemo.py”,第36行,在
mixensonly().test()
测试中的第9行文件“superdemo.py”
super(MixinX,self).test()
测试中的第14行文件“superdemo.py”
super(MixinY,self).test()
测试中第19行的文件“superdemo.py”
super(MixinZ,self).test()
AttributeError:“超级”对象没有属性“测试”
>>>FinalXYZ.mro()
[, , , ]
"""

谢谢。但还有一个问题。“许多mixin类被“添加”到BaseReplicatedValue以创建ReplicatedValue”不会影响