在說明Mixin
之前,有必要提一下模板方法模式。
模板方法模式定義了一個(gè)算法步驟,并允許子類為一個(gè)或者多個(gè)步>驟提供實(shí)踐方法。從而達(dá)到在子類不破壞原有算法架構(gòu)的前提下,>達(dá)到一定程度上算法重新實(shí)現(xiàn)的目的。
模板方法模式在靜態(tài)語言中是非常經(jīng)典的23種設(shè)計(jì)模式之一。(23種設(shè)計(jì)模式)但對(duì)于Python
這種動(dòng)態(tài)語言而言,模板方法就略顯雞肋:傳統(tǒng)的模板方法模式需要預(yù)先編寫一個(gè)基類,而對(duì)于Python
這種動(dòng)態(tài)語言而言,使用普通的自定義函數(shù)完全可以達(dá)到同等的目的。(谷歌大神關(guān)于動(dòng)態(tài)語言中設(shè)計(jì)模式的看法)
針對(duì)Python
,有人提出了Mixin
模式的思路來解決不同子類某一屬性或者方法的不同表現(xiàn)的問題。
Python
中每一個(gè)新式類都有一個(gè)__bases__
屬性,它是一個(gè)用來存儲(chǔ)自己的基類的元組(tuple)。而通過對(duì)__bases__
屬性的操作,可以實(shí)現(xiàn)在運(yùn)行過程中對(duì)某一個(gè)類動(dòng)態(tài)添加基類,已達(dá)到動(dòng)態(tài)添加方法和屬性的目的。而動(dòng)態(tài)添加基類的操作就是Mixin
(混入)。
Mixin
模式提供了插件式的屬性和方法管理方式,提高了代碼的可擴(kuò)展性,通過添加基類的方式來為歷史代碼增加新的功能和特性。
下面給出一個(gè)Mixin
的小型demo來演示一下:
class UseSimpleTeapot(object):
def get_teapot(self):
return SimpleTeapot() #假設(shè)SimpleTeapot已經(jīng)預(yù)先定義為簡易茶壺
class UseKungfuTeapot(object):
def get_teapot(self):
return KungfuTeapot() #假設(shè)KungfuTeapot已經(jīng)預(yù)先定義為功夫茶壺
class UseCoffeepot(self):
def get_teapot(self):
return Coffeepot() #假設(shè)Coffeepot已經(jīng)預(yù)先定義為咖啡壺
def common_officer():
staff = Staff()
staff.__bases__ += (UseSimpleTeapot, )
return staff
def group_leader():
staff = Staff()
staff.__bases__ += (UseKungfuTeapot, )
return staff
def boss():
staff = Staff()
staff.__bases__ += (UseKungfuTeapot, UseCoffeepot)
return staff
更進(jìn)一步的,可以把選項(xiàng)做成配置項(xiàng)來達(dá)到動(dòng)態(tài)加載的目的:
import mixins
def staff():
staff = Staff()
bases = []
for i in config.form.checked():
bases.append(getattr(mixins, i))
staff.__bases__ += tuple(bases)
return staff