python mro算法_python MRO:C3算法

http://www.codeweblog.com/python-mro-c3%E7%AE%97%E6%B3%95/

在 python 2.2 之后,python 实现了一个新的MRO算法:C3算法,用于方法解析顺序 。

一、什么是方法解析顺序

方法解析顺序 :多重继承时,用于在子类中调用父类方法时确定调用哪个父类的方法 。

多重继承代码示例:

#!/usr/bin/python

#-*- coding:utf8 -*-

class A(object):

def echo(self):

print "class_A"

class B(A):

pass

#def echo(self):

# print "class_B"

class C(A):

def echo(self):

print "class_C"

class D(B,C):

pass

print D.__mro__ //python使用__mro__ 来存储线性化计算的结果。

ubuntu@yee:/tmp$ python mro.py

(, , , , )

可以看到顺序为: D --> B --> C --> A --> object

当子类D调用echo方法时:

D().echo()

python 先搜索 D 本地类,再搜索B,有则返回,无则继续搜索C ,以此类推。

二、C3算法的原理

上面示例代码中所用到的正是C3算法,算法的表达式为:

L[D(B,C)]

= D + merge(L[B],L[C],[B,C])

以上表达式也等同于:

==>

L[D(B,C)] = D + merge(mro(B,object),mro(C,object),[B,C]) ==> L[D(B,C)] = D + merge( [B,object], [C,

object],[B,C]) [] : 列表表达式

merge: C3算法的核心

《python高级编程》中是这样写的:

取第一个列表的头,也就是L[B,object] ,如果这个头不在任何表的尾部,那么将它加到Class D的线性化中,并且从合并中的列表里删除 ;否则查找下一个列表的头,如果是个好的表头则取出它。 需要注意的是: 表头指是第一个元素 ,尾部是指除表头之外的其它所有元素 。如[A,B,C,D,E,F],A是表头,[B,C,D,E,F]是尾部。

方式解析:

L(D(B,C)) = D + merge( [B,object] ,[C,object] , [B,C] )

#列表[B,object]的表头是B,没有出现在其它表([C,object] 、[B,C] )的尾部

= [D, B] + merge( [object], [C,object] , [C] )

#列表[C,object]的表头是C,没有出现在其它表([object] 、[C] )的尾部 ,注意 [C] 这个列表只有表头,没有尾部

= [D, B,C] + merge( [object] , [object] )

= [D, B,C,object]

通过以上的运算,可以得出跟 D().__mro__ 一样的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值