在说明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