demo
# encoding=utf-8
__author__ = '[email protected]'
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
(,)(, )
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__來實現動態載入函式,
詳情參考
vue混入的詳解
混入 mixins 是一種分發 vue 元件中可復用功能的非常靈活的方式。混入物件可以包含任意元件選項。當元件使用混入物件時,所有混入物件的選項將被混入該元件本身的選項。同名鉤子函式將混合為乙個陣列,因此都將被呼叫。另外,混入物件的鉤子函式將在元件自身鉤子函式之前呼叫 div body html v...
Ruby中的Mixin (混入)
在ruby中,我們可以把乙個模組混入 mixin 到物件中,從而達到類似多重繼承的效果。下面舉幾個例子來仔細闡述一下這個問題 首先定義乙個module module foo def bar puts foo endend 然後我們把這個模組混入到物件中去 class demo include foo...
vue的mixins混入功能
混入minxins 分發vue元件中可復用功能的靈活方式。混入物件可以包含任意元件選項。元件使用混入物件時,所有混入物件的選項將混入該元件本身的選項。選項合併 元件選項和物件選項同名時,將以恰當方式混合。資料物件 和元件資料衝突時以元件資料優先 同名鉤子函式 混合為乙個陣列,都將被呼叫,混入物件鉤子...