zoukankan      html  css  js  c++  java
  • MRO 方法解释顺序

    MRO是用在多重继承中的。考虑这种情况,整个环境中父类是两个 P1,P2 子类是两个 C1,C2 而 孙子类是G1. 我们知道 G1会从 P1,P2,C1,C2中继承属性,但是如果有多个属性重名,那么G1,到底继承哪一个呢? PYTHON这时候会根据MRO去搜索需要的属性,搜索到了第一个,就用这个。所以MRO 顺序是非常重要的。 我们知道python 中的类其实是有经典类和新式类区别的(新式类其实就是在类定义的时候,指定从Object派生),那么对应的MRO也有两种,经典类有自己的MRO,而新式类也有自己的MRO。 看下面的例子。

    首先是经典类的MRO

    >>> class P1:
    ...     def foo(self):
    ...         print 'this is P1-foo'
    ...
    >>> class P2:
    ...     def foo(self):
    ...         print 'this is P2-foo'
    ...     def bar(self):
    ...         print 'this is P2-bar'
    ...
    >>> class C1(P1,P2):
    ...     pass
    ...
    >>> class C2(P1,P2):
    ...     def bar(self):
    ...         print 'this is C2-bar'
    ...
    >>> class G1(C1,C2):
    ...     pass
    ...

    这样定义完成之后, 几个类之间的关系如下:

    我们运行一下GC的函数看一下,

    >>> g1=G1()
    >>> g1.foo()
    this is P1-foo
    >>> g1.bar()
    this is P2-bar

    经典类的MRO是深度优先 从左到右,所以在搜索foo的时候,顺序是 G1->C1->P1。 在搜索C2时候的顺序是 G1->C1->P1->P2。 所以G2的bar就被跳过去了。

    我们再看一下新式类的MRO. 其实就是把上面的例子中 P1,P2改成从 object 派生:

    >>> g1.foo()
    this is P1-foo
    >>> g1.bar()
    this is C2-bar

    这是因为新式类的MRO是广度优先,从左到右,所以搜索foo的时候是 g1->c1->c2->p1 而 搜索 bar的时候是 g1->c1->c2。

  • 相关阅读:
    脊椎有问题的7个信号
    SOHO兼职 SOHO一族 世界创业实验室
    MSTParser句法工具使用方法
    BinaryFormatter序列化实例
    C#中文件流,网络流,缓冲流等流的概念理解
    探讨和比较Java和_NET的序列化_Serialization_框架
    .net中对象序列化技术浅谈
    史上最详细最容易理解的HMM文章
    成功者足迹的综合总结:网络创业14条不外传的绝招
    此情何时休
  • 原文地址:https://www.cnblogs.com/kramer/p/3685842.html
Copyright © 2011-2022 走看看