python面向对象高级:Mixin多重继承
继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记
Mixin
Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。
通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用。
使用Mixin的好处:
- 可以在不修改任何源代码的情况下,对已有类进行扩展
- 可以保证组件的划分
- 可以根据需要,使用已有的功能进行组合,来实现“新”类
- 很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类
'''
python 对于 mixin 命名方式一般以 MixIn, able, ible 为后缀。
由于 mixin 是组合,因而是做加法,为已有的类添加新功能,而不像继承一样,下一级会覆盖上一级相同的属性或方法。
但在某些方面仍然表现得与继承一样, 例如类的实例也是每个 mixin 的实例。
mixin 使用不当会导致类的命名空间污 染,所以要尽量避免 mixin 中定义相同方法。
对于相同的方法,有时很难区分 实例到底使用的是哪个方法。
'''
class Mixin1(object):
def test(self):
print("mixin 1")
def which_test(self):
self.test() class Mixin2(object):
def test(self):
print("mixin 2") class MyClass1(Mixin1, Mixin2):
pass # 按从左到右顺序从 mixin 中获取功能并添加到 MyClass class Myclass2(Mixin1, Mixin2):
def test(self): # 已有 test 方法,因而不会再添加 Mixin1, Mixin2 的 test 方法
print("my class 2") c1 = MyClass1()
c1.test() # "mixin 1"
c2 = MyClass2()
c2.test() # "my class 2"
c2.which_test() # "my class 2"
isinstance(c1, Mixin1) # True
issubclass(MyClass1, Mixin2) # True
学习资源来自:Python Mixin机制、python用法:Mixin
python面向对象高级:Mixin多重继承的更多相关文章
- python 面向对象高级应用(三)
目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- Python实用笔记 (25)面向对象高级编程——多重继承
class Dog(Mammal, Runnable): pass 多重继承,继承了不同大类的所有功能,这种设计称之为Mixln,其目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过 ...
- python 面向对象高级编程
数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.
- Python面向对象--高级(二)
## 使用__slots__限制类的属性 - 之前说到,可以通过在类外部实例或者类名任意定义实例属性或者类属性或者方法 class Person(object): pass Person.name = ...
- 17、Python面向对象高级
一.isinstance和issubclass type():不会认为子类实例是一种父类类型: isinstance():认为子类实例是一种父类类型. issubclass():判断是否为其子类. c ...
- Python面向对象高级之类的特殊成员
上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用.无论人或事物往往都有不按套路出 ...
- python面向对象高级编程
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Studen ...
随机推荐
- mongodb安装使用笔记
mongodb安装使用 安装后配置环境变量 创建数据库文件夹并连接数据库,并执行mongod --dbpath c:\workname 打开新的cmd,执行mongo命令,管理数据库 show dbs ...
- 联想一体机u盘启动设置
开机启动按f12键,进入后,到最后一项exit把OS Optimized Defaults(操作系统优化的缺省值)改成Disabled(关闭). 再进入到Startup这一项,选择UEFI/Legac ...
- Python 统计代码量
#统计代码量,显示离10W行代码还有多远 #递归搜索各个文件夹 #显示各个类型的源文件和源代码数量 #显示总行数与百分比 import os import easygui as g #查找文件 def ...
- 解决“Connection to https://dl-ssl.google.com refused”问题
相信一些人刚开始搞android的安装开发环境的时候会遇到:Failed to fectch URl https://dl-ssl.google.com/android/repository/addo ...
- Python对文件和文件路径的管理
1. 使用os.path进行路径和文件管理 1.1 拆分路径 os.path.split 返回一个二元组,包含文件路径和文件名 os.path.dirname ...
- C语言的f(open)函数(文件操作/读写)
头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: FILE * fopen(const char * path, ...
- C++ template —— 模板与继承(八)
16.1 命名模板参数许多模板技术往往让类模板拖着一长串类型参数:不过许多参数都设有合理的缺省值,如: template <typename policy1 = DefaultPolicy1, ...
- C 预处理
http://baike.baidu.com/link?url=0mwKZRcxHuNHa_TiwXgpQPS2S-YbOGCUJVSgZ9sb-qe-G-x4oIDZpWuZqiVNBsMYA4HT ...
- LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
解决方法 属性=>配置属性=>输入=>忽略特定库LIBCMT
- PHP关于按位取反结果的推导过程
哎呀几年过去,都快把大学学的计算机导论的知识给忘完了,现在来回顾一下按位去反的流程: <?php /** 首先来补充一下基础知识: php中有4个位运算,分别是&与 |或 ^异或 ~取反 ...