Python中的Mixin模式

在說明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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容