【问题标题】:Python Classes InheritancePython 类继承
【发布时间】:2016-06-02 03:03:42
【问题描述】:

我在理解 python 的 mro(方法解析顺序)时遇到了一些麻烦。 Python 从左到右运行。因此,根据我的理解,调用 M 的顺序应该是。 M、B、A、Z、X、Y

class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

print(M.mro())

但是正确的调用顺序是。

    [<class '__main__.M'>,
 <class '__main__.B'>,
 <class '__main__.A'>,
 <class '__main__.X'>,
 <class '__main__.Y'>,
 <class '__main__.Z'>,
 <class 'object'>]

谁能解释一下顺序并帮助我理解这一点。谢谢

【问题讨论】:

标签: python class inheritance method-resolution-order


【解决方案1】:

mro 从 Python2.3 开始就基于 C3 算法,“合并”是该算法的核心。 how merge works。 根据你的代码,这里我们可以列出如何获取mro(M):

mro(M) = [M] + merge(mro(B), mro(A), mro(Z), [B,A,Z])    

mro(B) = [B] + merge(mro(Y) , mro(Z)) = [B] + merge([Y] , [Z])
       = [B,Y] + merge([Z]) 
       = [B,Y,Z]

mro(A) = [A] + merge(mro(X) , mro(Y)) 
       = [A] + merge([X],[Y]) 
       = [A,X,Y]

mro(Z) = [Z]

返回mro(M):

mro(M) = [M] + merge([B,Y,Z), [A,X,Y], [Z], [B,A,Z]) 
       = [M,B] + merge([Y,Z], [A,X,Y], [Z], [A,Z]) 
       = [M,B,A] + merge([Y,Z], [X,Y], [Z], [Z]) 
       = [M,B,A,X] + merge([Y,Z] + [Y] + [Z], [Z]) 
       = [M,B,A,X,Y] + merge([Z] + [Z] + [Z]) 
       = [M,B,A,X,Y,Z]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2018-10-05
    • 2016-06-28
    • 2011-09-26
    相关资源
    最近更新 更多