Python Mixin混入的使用方法

2021-09-07 02:52:32 字數 1200 閱讀 1975

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元件中可復用功能的靈活方式。混入物件可以包含任意元件選項。元件使用混入物件時,所有混入物件的選項將混入該元件本身的選項。選項合併 元件選項和物件選項同名時,將以恰當方式混合。資料物件 和元件資料衝突時以元件資料優先 同名鉤子函式 混合為乙個陣列,都將被呼叫,混入物件鉤子...