美文网首页
Python中的Mixin模式

Python中的Mixin模式

作者: MontyOak | 来源:发表于2017-07-22 17:34 被阅读383次

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

          本文链接:https://www.haomeiwen.com/subject/sanykxtx.html