1.什么是Mixin

在面向对象编程中,Mixin是一种类,这种类包含了其他类要使用的方法,但不必充当其他类的父类。其他类是如何获取Mixin中的方法因语言的不同而不同。所以有时候Mixin被描述为’include’(包含)而不是 inheritance(继承)。

Mixins鼓励代码重用,并且可以用于避免多重继承可能导致(“如钻石问题”)的继承歧义,或者解决一个缺乏对一种语言的多重继承的支持。mixin也可以被看作 实现方法 的接口。 这种模式是强制依赖性反转原理的一个例子。

2.Mixin来源

mix-in是一种冰淇淋,提供一些基础口味(香草,巧克力等),在这种基础口味上可以添加其他食品(坚果,小饼干)。Mixin术语由此得来

3.定义及优点

Mixins是一种语言概念,允许程序员将一些代码注入到一个类中。Mixin编程是一种软件开发的风格,其中功能单元在一个类中创建,然后与其他类混合。

mixin类扮演父类的角色,包含其他类想要的功能。 然后,一个子类可以继承或简单地重用此功能,但不能作为专业化的手段。通常,mixin将会将所需的功能导出到子类中,而不会创建一个单一的“is a”关系。 这是mixins和继承的概念之间的重要区别,因为子类仍然可以继承父类的所有功能,但是,不必一定应用关于子对象“作为一种”父语义的语义。

优点

  • 通过允许多个类使用通用功能,但没有多重继承的复杂语义,为多重继承提供了一种机制.
  • 代码可重用性:当程序员希望在不同类之间共享功能时,Mixins很有用。 而不是一遍又一遍地重复相同的代码,通用功能可以简单地分组成一个混合,然后继承到需要它的每个类中。
  • Mixins允许继承和使用只有父类的所需功能,不一定是父类的所有功能.

4.在python中的应用

在Python中,SocketServer模块]具有UDPServer类和TCPServer类。它们分别作为UDP和TCP套接字服务器的服务器。 另外,还有两个mixin类:ForkingMixIn和ThreadingMixIn。通常,所有新连接都在相同的过程中处理。 通过使用ThreadingMixIn扩展TCPServer,如下所示:

class ThreadingTCPServer(ThreadingMixIn, TCPServer):pass

ThreadingMixIn类向TCP服务器添加功能,以便每个新连接创建一个新的线程。或者,使用ForkingMixIn将导致为每个新连接分叉进程。 显然,创建新线程或分支进程的功能作为独立类不是非常有用的。

在此使用示例中,mixins提供了替代底层功能,而不影响套接字服务器的功能。

5.在Django项目中的应用

Django TemplateView的实现代码如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class TemplateView(TemplateResponseMixin, ContextMixin, View):"""A view that renders a template.  This view will also pass into the contextany keyword arguments passed by the URLconf."""def get(self, request, *args, **kwargs):context = self.get_context_data(**kwargs)return self.render_to_response(context)

可以看到,这个视图‘继承了’TempalteResponseMixin,和ContextMixin以及View。

TempalteResponseMixin和ContextMixin实现分别如下:

class TemplateResponseMixin(object):"""A mixin that can be used to render a template."""template_name = Nonetemplate_engine = Noneresponse_class = TemplateResponsecontent_type = Nonedef render_to_response(self, context, **response_kwargs):"""Returns a response, using the `response_class` for thisview, with a template rendered with the given context.If any keyword arguments are provided, they will bepassed to the constructor of the response class."""response_kwargs.setdefault('content_type', self.content_type)return self.response_class(request=self.request,template=self.get_template_names(),context=context,using=self.template_engine,**response_kwargs)def get_template_names(self):"""Returns a list of template names to be used for the request. Must returna list. May not be called if render_to_response is overridden."""if self.template_name is None:raise ImproperlyConfigured("TemplateResponseMixin requires either a definition of ""'template_name' or an implementation of 'get_template_names()'")else:return [self.template_name]class ContextMixin(object):"""A default context mixin that passes the keyword arguments received byget_context_data as the template context."""def get_context_data(self, **kwargs):if 'view' not in kwargs:kwargs['view'] = selfreturn kwargs

可以看到这两个Mixin实际上只是为了给TemplatesView提供get_context_datarender_to_response两个接口以及其他需要的数据,但这里并不适合把这两个类解释为TemplatesView的父类,而更倾向于解释为提供接口及数据。把这两个类封装成mixin格式可以提高代码的重用性,把这两个类直接设计成函数我认为(个人见解,还 请指正)也是可以的,只不过这样以来就不那么面向对象编程了。所以可以说Mixin应该是一种设计思想,并没有什么独特之处。至于好多类名字中为什么要加上Mixin,这只是为了提高代码的可读性而已。

python教程:mixin详解相关推荐

  1. python详细安装教程环境配置-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  2. python 正则表达式 断言 不定长表达式_【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言...

    Python 2.7的官网文档中的解释是:(?!...)Matches if ... doesn't match next. This is a negative lookahead assertio ...

  3. Python Pandas绘图教程(详解版)

    Python Pandas绘图教程(详解版) Pandas 在数据分析.数据可视化方面有着较为广泛的应用,Pandas 对 Matplotlib 绘图软件包的基础上单独封装了一个plot()接口,通过 ...

  4. 站长在线Python教程:Python中类定义详解

    导读:欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中类定义详解>. 我们在上一节内容<Python中面向对象相关概述详解>中学习过,类是具有相同 ...

  5. python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  6. Redis数据库教程——系统详解学习Redis全过程

    Redis数据库教程--系统详解学习Redis全过程 Redis快速入门:Key-Value存储系统简介 Key-Value存储系统:     Key-Value Store是当下比较流行的话题,尤其 ...

  7. python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  8. python3.8安装pygame_Python3.8安装Pygame教程步骤详解

    注:因为最近想用一下Python做一些简单小游戏的开发作为项目练手之用,而Pygame模块里面提供了大量的有用的方法和属性.今天我们就在之前安装过PyCharm的基础上,安装Pygame,下面是安装的 ...

  9. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...

    想了解Python3.8安装Pygame教程步骤详解的相关内容吗,孤傲小二~阿沐在本文为您仔细讲解Python3.8安装Pygame的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Pyth ...

  10. python 正则使用详解

    python 正则使用详解 什么是正则 在 python 中使用正则 一些正则的定义 python 正则的方法 match 从字符串开头匹配 正则返回的结果分析(重要) fullmatch 严格匹配整 ...

最新文章

  1. 汇编语言王爽第二版-课后答案以及解析
  2. dax 计算某一列重复出现次数
  3. 神奇!C语言还可以这样用来仿真
  4. 一加6html查看程序,一加6T评测:极速屏下指纹,解锁你想要的轻快顺滑
  5. 大数据学习笔记03:安装配置CentOS7虚拟机
  6. 64如何传入后台_如何保证API接口数据安全?
  7. 无需第三方app,清理Mac缓存垃圾
  8. 计算机的五笔咋么学,电脑五笔输入法怎么学
  9. 2021 年度最佳开源软件榜单
  10. 利用朴素贝叶斯分析鸢尾花,代码有详细解释。
  11. html5 双指缩放图片,js实现移动端图片预览:手势缩放, 手势拖动,双击放大......
  12. wd移动硬盘不能识别_西部数据移动硬盘无法识别恢复
  13. 云呐|医院医疗的IT设备信息化资产盘点管理系统
  14. JS手机触摸屏的事件用法详解
  15. 编辑器工具--通用编辑器工具(持续完善中)
  16. 移动端」H5页面长按复制功能实现
  17. 此网站尚未经过身份验证
  18. 张宇课程,考研数学130+不是梦!
  19. linux pdf编辑器
  20. w7系统文件服务器,硬盘直接安装win7原版系统的具体方法

热门文章

  1. Ubuntu 软件包管理APT
  2. 短序列组装Sequence Assembly(转载)
  3. 【PP操作手册】创建公司间交易采购订单
  4. Oracle 查看表空间的大小及使用情况sql语句
  5. SAP后台执行大数据量报表(鹦鹉学舌篇)
  6. PP后台配置-定义工作中心标准值
  7. SD Price公式(例程,即Formula)
  8. Oracle错误ORA-01800——ORA-01899
  9. 物料主数据(SAP屠夫)
  10. SAP成本收集器两则