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。

  • 相关阅读:
    uCOS-II 学习笔记之任务管理--------任务控制块OS_TCB
    uCOS-II 学习笔记之事件管理--------信号量管理的学习
    格子计划
    phpcms二次开发之base.php的桥梁作用
    [leedcode 215] Kth Largest Element in an Array
    [leedcode 214] Shortest Palindrome
    [leedcode 213] House Robber II
    [leedcode 212] Word Search II
    [leedcode 211] Add and Search Word
    [leedcode 210] Course Schedule II
  • 原文地址:https://www.cnblogs.com/kramer/p/3685842.html
Copyright © 2011-2022 走看看