为何补充这个呢,我们在看一些框架源码的时候,经常在一个类的方法中看到调用了一个方法,这个方法在本类没有定义,在父类及一直往上都没有定义,反而在最终的孙子继承类找到了,这个就是动态多态,其实本质就是MRO查找原理。 示例:
class A:
pass
class B(A):
def f1(self):
self.print_info("你好")
print("self的id:",id(self))
print(isinstance(self,D))
class C(B):
def print_info(self, msg):
print("msg:", msg)
class D(C):
pass
d = D()
d.f1()
print("d对象的id:",id(d))
print(d.__dict__)
打印结果:
msg: 你好
self的id: 4342261008
True
d对象的id: 4342261008
{}
d.f1()时到B的f1函数里self就是d对象。 用MRO分析完全一致:
- d.f1()后:查找对象d的dict空的
- 往C中找,C中没找到
- 往B中找,B中找到了
- 调用self.print_info(“你好”),其实就是d.print_info(“你好”)
- 又开始从d.dict找,没找到
- 往C中找,C中找到了
- 执行print_info(“你好”)







赣ICP备2025054460号-1