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。

  • 相关阅读:
    http 请求包含哪几个部分(请求行、请求头、请求体)
    BUG处理流程说明
    如何正确分析定位BUG
    如何定位bug是前端还是后端以及用的工具
    测试阶段划分为哪几个阶段?
    java实现一个简单的图书管理系统
    sql增、删、改、查基础封装类
    Ubuntu18.04 install sougou pinyin
    tensorboard网页打不开问题
    c++11 实现numpy argmax argmin
  • 原文地址:https://www.cnblogs.com/kramer/p/3685842.html
Copyright © 2011-2022 走看看