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__來實現動態載入函式,
詳情參考