__mro__属性

__mro__ 是 Python 中的一个特殊属性,它代表了类的方法解析顺序(Method Resolution Order)。MRO 定义了子类在继承关系中查找方法和属性的顺序。在多继承的情况下,MRO 确定了方法和属性的查找顺序,以避免冲突和歧义。

__mro__ 的用途

  • 方法解析顺序:__mro__ 属性定义了方法解析的顺序,也就是在多继承中,当一个方法被调用时,Python 会按照 __mro__ 中的顺序查找该方法的实现。
  • 冲突解决:当多个父类具有相同名称的方法或属性时,__mro__ 可以帮助确定使用哪个父类的方法或属性。

__mro__ 最佳实践

  • 使用 super():在多继承中,通过使用 super() 函数调用父类的方法,可以避免直接访问 __mro__
  • 遵循线性化规则:多继承的类应该遵循 C3 线性化规则,这样才能保证 __mro__ 返回的结果是正确的。

 

复制代码
 1 class A:
 2     pass
 3 
 4 
 5 class B(A):
 6     pass
 7 
 8 
 9 class C(A):
10     pass
11 
12 
13 class D(B, C):
14     pass
15 
16 
17 print(D.__mro__)
18 # 输出结果:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
复制代码

D 继承自类 B 和类 C,而类 B 和类 C 又都继承自类 A。通过打印 D.__mro__,可以查看到方法解析顺序为 D -> B -> C -> A -> object

 

复制代码
 1 # 1. 师父类,属性和方法
 2 class Master(object):
 3     def __init__(self):
 4         self.kongfu = '[古法煎饼果子配方]'
 5 
 6     def make_cake(self):
 7         print(f'运用{self.kongfu}制作煎饼果子')
 8 
 9 
10 # 2. 定义徒弟类,继承师父类 和 学校类, 添加和父类同名的属性和方法
11 class Prentice(Master):
12     def __init__(self):
13         self.kongfu = '[独创煎饼果子技术]'
14 
15     def make_cake(self):
16         print(f'运用{self.kongfu}制作煎饼果子')
17 
18 
19 # 3. 用徒弟类创建对象,调用实例属性和方法
20 xiao_a = Prentice()
21 
22 print(xiao_a.kongfu)  # [独创煎饼果子技术]
23 
24 xiao_a.make_cake()  # 运用[独创煎饼果子技术]制作煎饼果子
25 
26 print(Prentice.__mro__)  # (<class '__main__.Prentice'>, <class '__main__.Master'>, <class 'object'>)
复制代码

 

posted @   Allen_Hao  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示