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功能特色. 带任意数量参数的函数 你 ...
随机推荐
- EF 拉姆达 动态拼接查询语句
EF 动态拼接查询语句 using System; using System.Collections.Generic; using System.IO; using System.Linq; usin ...
- 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)
SD卡已经看了两天了,主要是因为测试出来的卡容量不对,所以一直找原因,最终还是发现了,总比不过是单位上面出现了问题,或许是之前没有接触到SD的缘故吧,所以对其中的一些寄存器很不了解,一切都是重新开始, ...
- DM365视频处理流程/DM368 NAND Flash启动揭秘
出自http://blog.csdn.net/maopig/article/details/7029930 DM365的视频处理涉及到三个相关处理器,分别是视频采集芯片.ARM处理器和视频图像协处理器 ...
- 2013长沙网络赛H题Hypersphere (蛋疼的题目 神似邀请赛A题)
Hypersphere Time Limit: 1 Second Memory Limit: 32768 KB In the world of k-dimension, there's a ...
- java POI读取excel 2007/2003
2003版office excel读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io ...
- 心急的C小加(两种解法)
心急的C小加 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的 ...
- Android 官方文档:(二)应用清单 —— 2.26 <uses-permission>标签
syntax: <uses-permission android:name="string" android:maxSdkVersion="inte ...
- FileUpload的使用案例
文件上传 1.www.apache.org下载commons fileupload 和 commons io 2.创建jsp并附上如下代码 <%@ page language="jav ...
- java的wait和notifyAll使用方法
class Num { private int num; public int getNum() { return num; } public void setNum(int num) { this. ...
- JVM 垃圾回收机制( 一) 回收对象的判定
关于JVM 的垃圾回收机制,我们一般都没过多深入,因为JAVA 和 C++ 的一个很大区别就是,JAVA 帮我们做了垃圾回收,而不用像C++ 那么样手动进行回收,当然任何自动的东西都存在一定弊端,比如 ...