Python Mixin混入的使用方法

weixin_34391854發表於2015-10-04

DEMO

# encoding=utf-8 
__author__ = 'kevinlu1010@qq.com' 


class Base(): 
    def f1(self): 
        print 'I am f1 in Base' 

    def f2(self): 
        print 'I am f2 in Base' 

class C0(): 
    def f2(self): 
        print 'I am f2 in C0' 
class C1(C0): 
    def __init__(self): 
        print 'init' 
    def f1(self): 
        print 'I am f1 in C1' 


if __name__=='__main__': 
c = C1() 
c.f1() 
c.f2() 
print C1.__bases__ 
C1.__bases__ = (Base,)+C1.__bases__ 
print C1.__bases__ 
c.f1() 
c.f2()

輸出:

init
I am f1 in C1
I am f2 in C0
(<class __main__.C0 at 0x02177AB0>,)
(<class __main__.Base at 0x0053DA78>, <class __main__.C0 at 0x02177AB0>)
I am f1 in C1
I am f2 in Base

python的mixin可以實現程式在執行的過程中,動態修改一個類的繼承關係。
一個類的__base__引數會記錄這個類的所有繼承關係,所以通過修改一個類的__bases__的值,就可以實現動態修改這個類的繼承關係。
上面修改了C1這個類的__bases__=(Base,C0),在前面的類會覆蓋後面的類的相同名稱的方法或屬性,例如這裡Base的f2方法會覆蓋C0的f2方法
這個順序規則與多繼承(MRO)是一樣的

Mixin會有個隱患,因為修改繼承關係是對一個類操作的,所以當這個類有多個例項的時候,修改__bases__會影響所有的例項,所以可以通過修改例項的__dict__來實現動態載入函式,
詳情參考

相關文章