【Python】Python面向对象补充动态多态

为何补充这个呢,我们在看一些框架源码的时候,经常在一个类的方法中看到调用了一个方法,这个方法在本类没有定义,在父类及一直往上都没有定义,反而在最终的孙子继承类找到了,这个就是动态多态,其实本质就是MRO查找原理。 示例:

python
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__)


打印结果:

text
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("你好")