python用法——Mixin
在读werkzeug和flask的源码中,经常能遇到类名中有mixin这个东西。这个东西的用法让我想到了java中的接口名有able的用法。今天我就来看了看这个mixin是什么东西。
学习了python的都知道,python是支持多继承的,但是支不支持动态继承性质呢?在程序运行过程中,重定义类的继承,python是支持这种动态继承性质的。这也就是python中的mixin,在定义类过程中改变类的继承顺序,继承类。当某个模块不能修改时,通过mixin方式可以动态添加该类的方法,动态改变类的原有继承体系。
Mixin
Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用。
使用mixin机制有如下好处:可以在不修改任何源代码的情况下,对已有类进行扩展;可以保证组件的划分;可以根据需要,使用已有的功能进行组合,来实现“新”类;很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类。
在举例子之前,我们需要先熟悉几个关键字:
__bases__: 返回一个元组,该元组元素是类的基类,如:class a:
passprint(a.bases)
(<class 'object'>,)
可见a类继承了object类__mro__:This attribute is a tuple of classes that are considered when looking for base classes during method resolution.我的理解是 返回一个元组,该元组元素是该类的继承的类,当查询继承的时候会按从左到右的顺序。以刚刚的a类为例:print(a.mro)
(<class 'main.a'>, <class 'object'>)
例子
在了解了以上的知识后,我来举个例子
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!')
class testMixin:
def test(self):
print('In the testMixin class!')
class test2(test1, testMixin):
def test(self):
print('In the test2 class!')
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__)
输出结果:
(<class '__main__.test0'>, <class '__main__.test1'>, <class 'object'>)
In the test1 class!
In the testMixin class!
(<class '__main__.test0'>, <class '__main__.testMixin'>, <class '__main__.test1'>, <class 'object'>)
(<class '__main__.test2'>, <class '__main__.test1'>, <class '__main__.testMixin'>, <class 'object'>)
(<class '__main__.test2'>, <class '__main__.test1'>, <class '__main__.testMixin'>, <class 'object'>)
注意本例的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__返回的元组的元素顺序不一样会导致继承的顺序不一样,类会优先继承元组左边的类
python用法——Mixin的更多相关文章
- MongoDB数据库及其Python用法
一 .命令行模式 mongo # 进入mongodb命令行模式 show dbs use taobao # 进入该数据库,如不存在则创建之 show tables # 条件操作符 (>) 大于 ...
- Python用法
Python用法 IDE IDE是集成开发环境:Integrated Development Environment的缩写. 使用IDE的好处在于按,可以把编写代码.组织项目.编译.运行.调试等放到一 ...
- python用法笔记(数组(list、touple、dict)、字符串)
1.产生n个全为1的数组a=[1]*n2.字符数字转化int('12')float('12.5')str(123.45)ASCII码转为相应的字符:chr(97)字符转化为相应的ASCII码:ord( ...
- Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
timeit模块用于测试一段代码的执行效率 1.Timer类 Timer 类: __init__(stmt="pass", setup="pass", time ...
- 关于Python的Mixin模式
转自:http://www.bjhee.com/python-mixin.html 像C或C++这类语言都支持多重继承,一个子类可以有多个父类,这样的设计常被人诟病.因为继承应该是个”is-a”关系. ...
- 【转载】关于Python的Mixin模式
本博按: mixin是看起来是多继承的一种,但是,这种继承并不作为父类存在,而是增加功能到子类中. 像C或C++这类语言都支持多重继承,一个子类可以有多个父类,这样的设计常被人诟病.因为继承应该是个” ...
- 通过 Python 理解 Mixin 概念
Mixin 的概念 Mixin 即 Mix-in,常被译为"混入",是一种编程模式,在 Python 等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组 ...
- Python的Mixin
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826299.html 一:Mixin模式 Mixin编程是一种开发模式,是一种 将多个不同类中的功能单元的 ...
- 【转】你需要知道的Python用法
在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些的你应该了解的Pyghon功能特色. 带任意数量参数的函数 你 ...
随机推荐
- [Head First Python]4. summary
1- strip()方法可以从字符串去除不想要的空白符 (role, line_spoken) = each_line.split(":", 1) line_spoken = li ...
- Travel(HDU 5441 2015长春区域赛 带权并查集)
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- [TYVJ] P1004 滑雪
滑雪 背景 Background 成成第一次模拟赛 第三道 描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示 ...
- LINUX系统GIT使用教程
Git使用笔记. 1 安装GIT $ sudo aptitude install git $ sudo aptitude install git-doc git-svn git-email git ...
- 段和RSEG用法
RSEG是段选择指令,要想明白它的意思就要了解段的意思. 段是程序代码或数据对象的存储单位.程序代码放到代码段,数据对象放到数据段.段分两种,一是绝对段,一是再定位段.绝对段在汇编语言中指定,在用L5 ...
- 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)
游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...
- java使用poi创建excel文件
import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import or ...
- .Net语言中关于AOP 的实现详解
来源: IT人家 发布时间: 2011-03-22 20:28 阅读: 3546 次 推荐: 2 原文链接 [收藏] 摘要:该文章主要和大家讲解开发应用系统时在.Net语言中关于AOP ...
- BCD码、十六进制与十进制互转
在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间 ...
- c# 高斯模糊
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using Syste ...