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