使用Mixin设计模式进行Python编程的方法讲解

 更新时间:2016年06月21日 18:55:11   作者:TypingQuietly   我要评论
Mixin模式也可以看作是一种组合模式,综合多个类的功能来产生一个类而不通过继承来实现,下面就来整理一下使用Mixin设计模式进行Python编程的方法讲解:

Mixin模式是一种在python里经常使用的模式,适当合理的应用能够达到复用代码,合理组织代码结构的目的。

Python的Mixin模式可以通过多继承的方式来实现, 举例来说,我们自定义一个简单的具有嵌套结构的数据容器:

class SimpleItemContainer(object):
  def __init__(self, id, item_containers):
    self.id = id
    self.data = {}
    for item in item_containers:
      self.data[item.id] = item

SimpleItemContainer通过python内置类型Dict来存放数据,不过到目前为止想要访问对应的数据还是得直接调用里面的字典,没法像原生的字典一样方便的通过暴露出来的api访问数据。当然也可以从头开始把完整的Dictionary Interface完全实现个遍,不过在每个自定义的类似的容器中都来一套肯定不行,这时候利用python内置的UserDict.DictMixin就是一个不错的方式:

from UserDict import DictMixin

class BetterSimpleItemContainer(object, DictMixin):
  def __getitem__(self, id):
    return self.data[id]
  def __setitem__(self, id, value):
   self.data[id] = value
  def __delitem__(self, id):
   del self.data[id]
  def keys(self):
      return self.data.keys()

通过实现最小的Dictionary Interface,还有继承DictMixin实现Mixin模式,我们就轻松获得了完整的原生字典的行为:下表语法,get, has_keys, iteritems, itervalues甚至还有iterable protocol implementation等一系列的方法和实现。

很多框架比如Django, Django rest framework里面就普遍用到了Mixin这种模式,定义api或者viewset的时候就能够通过多重继承的方式服用一些功能

当然,Mixin模式也不能滥用,至少他会污染你新定义的类,有时候还会带来MRO的问题;不过把一些基础和单一的功能比如一般希望通过interface/protocol实现的功能放进Mixin模块里面还是不错的选择:

class CommonEqualityMixin(object):
  def __eq__(self, other):
    return (isinstance(other, self.__class__)
      and self.__dict__ == other.__dict__)
  def __ne__(self, other):
    return not self.__eq__(other)
class Foo(CommonEqualityMixin):
  def __init__(self, item):
    self.item = item

其实整个理解下来无非就是通过组合的方式获得更多的功能,有点像C#, java里面的interface,强调“it can”的意思,但相比起来简单多了,不需要显示的约束,而且mixin模块自带实现。在使用的时候一般把mixin的类放在父类的右边似乎也是为了强调这并不是典型的多继承,是一种特殊的多继承,而是在继承了一个基类的基础上,顺带利用多重继承的功能给这个子类添点料,增加一些其他的功能。保证Mixin的类功能单一具体,混入之后,新的类的MRO树其实也会相对很简单,并不会引起混乱。

相关文章

  • python文件和目录操作函数小结

    python文件和目录操作函数小结

    这篇文章主要介绍了python文件和目录操作函数小结,主要涉及到os模块和shutil模块的一些方法,需要的朋友可以参考下
    2014-07-07
  • Python通过正则表达式选取callback的方法

    Python通过正则表达式选取callback的方法

    这篇文章主要介绍了Python通过正则表达式选取callback的方法,涉及Python正则表达式及回调函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 如何实现删除numpy.array中的行或列

    如何实现删除numpy.array中的行或列

    如何实现删除numpy.array中的行或列?今天小编就为大家分享一篇对删除numpy.array中行或列的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 解决pycharm工程启动卡住没反应的问题

    解决pycharm工程启动卡住没反应的问题

    今天小编就为大家分享一篇解决pycharm工程启动卡住没反应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • TensorFlow实现创建分类器

    TensorFlow实现创建分类器

    这篇文章主要为大家详细介绍了TensorFlow实现创建分类器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 使用selenium和pyquery爬取京东商品列表过程解析

    使用selenium和pyquery爬取京东商品列表过程解析

    这篇文章主要介绍了使用selenium和pyquery爬取京东商品列表过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 在CMD命令行中运行python脚本的方法

    在CMD命令行中运行python脚本的方法

    今天小编就为大家分享一篇在CMD命令行中运行python脚本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python中模块查找的原理与方法详解

    python中模块查找的原理与方法详解

    这篇文章主要给大家介绍了python中模块查找的原理与方式,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • Python实现定时任务

    Python实现定时任务

    本篇文章主要介绍了Python实现定时任务,主要有5种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Python实现多并发访问网站功能示例

    Python实现多并发访问网站功能示例

    这篇文章主要介绍了Python实现多并发访问网站功能,结合具体实例形式分析了Python线程结合URL模块并发访问网站的相关操作技巧,需要的朋友可以参考下
    2017-06-06

最新评论