设为首页 收藏本站
查看: 1233|回复: 0

[经验分享] python用法——Mixin

[复制链接]

尚未签到

发表于 2015-12-1 10:26:58 | 显示全部楼层 |阅读模式
  在读werkzeug和flask的源码中,经常能遇到类名中有mixin这个东西。这个东西的用法让我想到了java中的接口名有able的用法。今天我就来看了看这个mixin是什么东西。
  学习了python的都知道,python是支持多继承的,但是支不支持动态继承性质呢?在程序运行过程中,重定义类的继承,python是支持这种动态继承性质的。这也就是python中的mixin,在定义类过程中改变类的继承顺序,继承类。当某个模块不能修改时,通过mixin方式可以动态添加该类的方法,动态改变类的原有继承体系

Mixin
  Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用
  使用mixin机制有如下好处:可以在不修改任何源代码的情况下,对已有类进行扩展;可以保证组件的划分;可以根据需要,使用已有的功能进行组合,来实现“新”类;很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类。
  在举例子之前,我们需要先熟悉几个关键字:


  •   __bases__: 返回一个元组,该元组元素是类的基类,如:
      class a:
      pass

    print(a.bases)  (,)
      可见a类继承了object类
      

  •   __mro__: This attribute is a tuple of> 我的理解是 返回一个元组,该元组元素是该类的继承的类,当查询继承的时候会按从左到右的顺序。以刚刚的a类为例:
      print(a.mro)
      (, )

例子
  在了解了以上的知识后,我来举个例子
  

import types  

  
def mixin(pyClass, pyMixinClass, key=0):
  if key:
  pyClass.__bases__ = (pyMixinClass,) + pyClass.__bases__
  elif pyMixinClass not in pyClass.__bases__:
  pyClass.__bases__ += (pyMixinClass,)
  else:
  pass
  

  
class test1:
  def test(self):

  print('In the test1>  

  
class testMixin:
  def test(self):

  print('In the testMixin>  

  
class test2(test1, testMixin):
  def test(self):

  print('In the test2>  

  
class test0(test1):
  pass
  

  
if __name__ == '__main__':
  print(test0.__mro__)  #继承了test1,object
  test_0 = test0()
  test_0.test()  #调用test1的方法
  mixin(test0, testMixin, 1)  #优先继承testMixin类
  test__0 = test0()
  test__0.test()  #由于优先继承了testMixin类,所以调用testMixin类的方法
  print(test0.__mro__)
  

  print(test2.__mro__)
  mixin(test2, testMixin)
  print(test2.__mro__)
  

  输出结果:
  

(, , )
  
In the test1>
  
In the testMixin>  
(, , , )
  
(, , , )
  
(, , , )
  

  注意本例的mixin方法,它的作用就是动态地给某个类(pyClass)通过继承的方式添加方法。
  要注意:pyClass.__bases__ = (pyMixinClass,) + pyClass.__bases__和pyClass.__bases__ += (pyMixinClass,) 二者的顺序是不一样的。 还是用例子说明:
  

a = (1,)  
a = a + (2,)
  
print(a)
  
#输出:(1,2)
  
a = (3,) + a
  
print(a)
  
#输出:(3,1,2)
  

  __bases__返回的元组的元素顺序不一样会导致继承的顺序不一样,类会优先继承元组左边的类

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145762-1-1.html 上篇帖子: 用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式) 下篇帖子: 【Python】Mac下sublimeText+python+pylinter环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表