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功能特色. 带任意数量参数的函数 你 ...
随机推荐
- vim 常用快捷键 二[转]
键盘移动 (Move) 一切都从键盘的移动k -> 上 upj -> 下 downh -> 左 leftl -> 右 rightz -> 重画屏幕,当前光标变成屏幕的第一 ...
- Python之路第十二天,高级(6)-paramiko
paramiko 一.安装 pip3 install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 1. 基于用户和密码链接 import paramiko # 创 ...
- 学习第一个头文件stdio.h
使用标准输入输出库函数时要用到 “stdio.h”文件,因此源文件开头应有以下预编译命令: #include<stdio.h> stdio是standard input&outup ...
- 【转】arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
原文网址:http://www.veryarm.com/296.html 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - 体系架 ...
- 使用 ServKit(PHPnow) 搭建 PHP 环境[图]
http://servkit.org/guide 搭建 PHP 其实不很难,只是有点繁琐.要是自己搭建一次 PHP + MySQL 环境很是费时.更糟的是,很多新手在配置 PHP 时常常出现这样那样的 ...
- Binary Search Tree Iterator 解答
Question Implement an iterator over a binary search tree (BST). Your iterator will be initialized wi ...
- LeeCode(Database)-Combine Two Tables
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- HDOJ-1014 Uniform Generator
http://acm.hdu.edu.cn/showproblem.php?pid=1014 给出式子seed(x+1) = [seed(x) + STEP] % MOD seed初始为0,给出STE ...
- curl 浏览器模拟请求实战
1,curl 常用选项
- hdu 4649 Professor Tian 多校联合训练的题
这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作 即 或 ,与 ,和异或 | & ^ )这样依次把操作符插入整 ...