澄清新型类中的 MRO
与旧的不同样式类、新样式类内省其基类以建立方法解析顺序 (MRO)。此顺序决定了在对象上调用方法时搜索方法的顺序。
解决与 MRO 的继承冲突
new- 中 MRO 之间的关键区别当同一个祖先类在继承层次结构中多次出现时,就会出现样式类和旧样式类。例如,考虑以下菱形继承情况:
class Base1(object):
def amethod(self):
print("Base1")
class Base2(Base1):
pass
class Base3(object):
def amethod(self):
print("Base3")
class Derived(Base2, Base3):
pass
Legacy-Style MRO:
在遗留样式类中,解析顺序为 D - B - A - C - A。这里,当调用 D 时.amethod(),首先找到A中的定义并覆盖C中的定义。
New-Style MRO:
对于新式类,MRO如下:
D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)
请注意,A 按此顺序仅出现一次,位于其所有子类之后。这确保了子类中的重写(例如C对方法的重写)优先。
理解MRO的重要性
新式类中的MRO解决了继承冲突明智地,允许覆盖正常运行。它还避免了同一方法的多个定义出现在解析顺序中的情况,从而导致不明确的行为。通过有效地理解和利用 MRO,开发人员可以在 Python 中设计健壮且可维护的继承层次结构。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3