欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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__ 属性

12.2多重继承和方法解析顺序(读书笔记)
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__
View Code

结果如下

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

 

 

分析类时,我经常在交互式控制台中查看 __mro__ 属性

 

12.2多重继承和方法解析顺序(读书笔记)
def print_mro(cls):
    print   ','.join(i.__name__ for i in cls.__mro__)
print_mro(D)
View Code

结果如下:

D,B,C,A,object
[Finished in 0.1s]