Python类Inheritan

2024-04-25 07:55:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在理解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'>]

有谁能解释一下订购的方式,帮我理解一下。谢谢


Tags: 方法object顺序main方式passclassprint
1条回答
网友
1楼 · 发布于 2024-04-25 07:55:54

mro从Python2.3开始就基于C3算法,“merge”是该算法的核心。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]

相关问题 更多 >