Python Mixin程式設計機制

2021-08-27 09:30:36 字數 1864 閱讀 1969

mixin程式設計是一種開發模式,是一種將多個類中的功能單元的進行組合的利用的方式,這聽起來就像是有類的繼

承機制就可以實現,然而這與傳統的類繼承有所不同。通常mixin並不作為任何類的基類,也不關心與什麼類一

起使用,而是在執行時動態的同其他零散的類一起組合使用。

使用mixin機制有如下好處:可以在不修改任何源**的情況下,對已有類進行擴充套件;可以保證元件的劃分;可以根據需要,使用已有的功能進行組合,來實現「新」類;很好的避免了類繼承的侷限性,因為新的業務需要可能

就需要建立新的子類。

python支援多繼承,即乙個類可以繼承多個子類。可以利用該特性,可以方便的實現mixin繼承。如下**,類a,b分別表示不同的功能單元,c為a,b功能的組合,這樣類c就擁有了類a, b的功能。

class a:

def get_a(self):

print 'a'

class b:

def get_b(self):

print 'b'

class c(a, b): pass

c = c()

c.get_a()

c.get_b()

多繼承的實現就會建立新類,有時,我們在執行時,希望給類a新增類b的功能時,也可以利用python的元程式設計特性,__bases__屬性便在執行時輕鬆給類a新增類b的特性,如下**:

a.__bases__ += (b,)

a.get_b()

其實__bases__也是繼承的機制,因為__bases__屬性儲存了類的基類。因此多繼承的方法也可以這樣實現:

class c:pass

c.__bases__ += (a, b, )

以上兩種方式,都是基於多繼承和python的元程式設計特性,然而在業務需求變化時,就需要新的功能組合,那麼就需要重新修改a的基類,這回帶來同步的問題,因為我們改的是類的特性,而不是物件的。因此以上修改會對

所有引用該類的模組都收到影響,這是相當危險的。通常我們希望修改物件的行為,而不是修改類的。

同樣的我們可以利用__dict__來擴充套件物件的方法。

class plugin(object):

def __init__(self):

self._exported_methods =

def plugin(self, owner):

for f in self._exported_methods:

owner.__dict__[f.__name__] = f

def plugout(self, owner):

for f in self._exported_methods:

del owner.__dict__[f.__name__]

class afeature(plugin):

def __init__(self):

super(afeature, self).__init__()

def get_a_value(self):

print 'a feature.'

class bfeature(plugin):

def __init__(self):

super(bfeature, self).__init__()

def get_b_value(self):

print 'b feature.'

class combine:pass

c = combine()

afeature().plugin(c)

bfeature().plugin(c)

c.get_a_value()

c.get_b_value()

Python Mixin程式設計機制

mixin程式設計是一種開發模式,是一種將多個類中的功能單元進行組合的利用方式,這聽起來就像是有類的繼承機制就可以實現,然而這與傳統的類繼承有所不同。通常minxin並不作為任何類的基類,也不關心與什麼類一起使用,而是在執行時動態的同其他零散的類一起組合使用。使用mixin機制有如下好處 可以在不修...

Python Mixin模式示例

個人的粗淺理解。mixin模式,主要是將不同的功能寫成不同的類,這些類被繼承之後,子類就會獲得這些功能。但是值得注意的是,雖然子類繼承了這些mixin類,但是它們並不是一種屬於的關係,而是一種平級的關係。乙個mixin類一般只實現乙個單一功能。class plane object def init ...

Python Mixin混入的使用方法

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 prin...