Python中的Mixin模式

在说明Mixin之前,有必要提一下模板方法模式。

模板方法模式定义了一个算法步骤,并允许子类为一个或者多个步>骤提供实践方法。从而达到在子类不破坏原有算法架构的前提下,>达到一定程度上算法重新实现的目的。

模板方法模式在静态语言中是非常经典的23种设计模式之一。(23种设计模式)但对于Python这种动态语言而言,模板方法就略显鸡肋:传统的模板方法模式需要预先编写一个基类,而对于Python这种动态语言而言,使用普通的自定义函数完全可以达到同等的目的。(谷歌大神关于动态语言中设计模式的看法)
针对Python,有人提出了Mixin模式的思路来解决不同子类某一属性或者方法的不同表现的问题。
Python中每一个新式类都有一个__bases__属性,它是一个用来存储自己的基类的元组(tuple)。而通过对__bases__属性的操作,可以实现在运行过程中对某一个类动态添加基类,已达到动态添加方法和属性的目的。而动态添加基类的操作就是Mixin(混入)。
Mixin模式提供了插件式的属性和方法管理方式,提高了代码的可扩展性,通过添加基类的方式来为历史代码增加新的功能和特性。
下面给出一个Mixin的小型demo来演示一下:

class UseSimpleTeapot(object):
    def get_teapot(self):
        return SimpleTeapot()    #假设SimpleTeapot已经预先定义为简易茶壶
class UseKungfuTeapot(object):
    def get_teapot(self):
        return KungfuTeapot()    #假设KungfuTeapot已经预先定义为功夫茶壶
class UseCoffeepot(self):
    def get_teapot(self):
        return Coffeepot()    #假设Coffeepot已经预先定义为咖啡壶


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

更进一步的,可以把选项做成配置项来达到动态加载的目的:

import mixins
def staff():
    staff = Staff()
    bases = []
    for i in config.form.checked():
        bases.append(getattr(mixins, i))
    staff.__bases__ += tuple(bases)
    return staff

你可能感兴趣的:(Python中的Mixin模式)