12.2多重继承和方法解析顺序(读书笔记)
程序员文章站
2022-06-19 12:41:01
Python 能区分 d.pong() 调用的是哪个方法,是因为 Python 会按照特定的顺序遍历继承图。这个顺序叫方法解析顺序(Method ResolutionOrder,MRO)。类都有一个名为 __mro__ 的属性,它的值是一个元组,按照方法解析顺序列出各个超类,从当前类一直向上,直到o ......
Python 能区分 d.pong() 调用的是哪个方法,是因为 Python 会按照特定
的顺序遍历继承图。这个顺序叫方法解析顺序(Method Resolution
Order,MRO)。类都有一个名为 __mro__ 的属性,它的值是一个元
组,按照方法解析顺序列出各个超类,从当前类一直向上,直到
object 类。D 类的 __mro__ 属性
class A(object): def ping(self): print('ping:', self) class B(A): def pong(self): print('pong:', self) class C(A): def pong(self): print('PONG:', self) class D(B, C): def ping(self): super(self).ping() print('post-ping:', self) def pingpong(self): self.ping() super(self).ping() self.pong() super(self).pong() C.pong(self) if __name__ == "__main__": print D.__mro__
结果如下
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
分析类时,我经常在交互式控制台中查看 __mro__ 属性
def print_mro(cls): print ','.join(i.__name__ for i in cls.__mro__) print_mro(D)
结果如下:
D,B,C,A,object
[Finished in 0.1s]