Python的Mixin程式設計機制

2021-10-02 09:16:51 字數 2369 閱讀 6896

##mixin 簡介

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

##特點

※使用 mixin 機制有如下好處:

※可以在不修改任何源**的情況下,對已有類進行擴充套件

※可以保證元件的劃分

※可以根據需要,使用已有的功能進行組合,來實現「新」類;

※很好的避免了類繼承的侷限性,因為新的業務需要可能就需要建立新的子類。

##多繼承

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

classa:

def get_a

(self)

: print 'a'

classb:

def get_b

(self)

: print 'b'

class

c(a, b)

: pass

c =c(

)c.get_a()

c.get_b

()

※__bases__

※多繼承的實現就會建立新類,有時,我們在執行時,希望給類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__()

self._exported_methods.

(self.get_a_value)

def get_a_value

(self)

: print 'a feature.'

class

bfeature

(plugin)

: def __init__

(self)

:super

(bfeature, self)

.__init__()

self._exported_methods.

(self.get_b_value)

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

()

Mixin程式設計

1 和多繼承類似 2.是一種開發模式 將多個類中功能進行組成使用classa defa self print a classb defb self print b class c a,b pass c c c.a c.b 多繼承會修改源 如果需要動態的給子類新增乙個父類則需要使用 bases cla...

Python基礎 MixIn設計 多重繼承

如果需要 混入 額外的功能,通過多重繼承就可以實現 示例 usr bin env python3 coding utf 8 多重繼承 飛class fly object deffly print fly 游泳 class swin object defswin print swin 超人 多重繼承 ...

vue的mixin的使用

對乙個專案中很多會重複使用到的函式我們可以使用到vue的mixin 混入 這樣就不需要在多個頁面中重複的書寫相同的 1.定義乙個mixin mixin.js const mixin created methods export default mixin 使用mixin 1.區域性使用 import...