当前位置: 云端笔记 » 编程 » Python » 【Python】面向对象补充(动态多态)

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

为何补充这个呢,我们在看一些框架源码的时候,经常在一个类的方法中看到调用了一个方法,这个方法在本类没有定义,在父类及一直往上都没有定义,反而在最终的孙子继承类找到了,这个就是动态多态,其实本质就是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(“你好”)
未经允许不得转载:云端笔记 » 【Python】面向对象补充(动态多态)

相关文章

评论 (0)

6 + 3 =

contact