mixin模式 python_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值