1.什么是Mixin设计模式

mixin设计模式可以看做是多继承的一种。那么首先,咱们谈谈为什么会出现多继承这种语法。

汽车和飞机他们都同属于交通工具,但飞机可以飞行,汽车无法做到,所以,飞行这个行为不能写到交通工具这个类中,如果每一个交通工具各自实现自己的行驶方法,就违背了代码尽可能重用的原则(如果交通工具种类越来越多,就会造成大量代码冗余)。

所以,我们要表示飞行这个行为,就需要进行多继承。但这样,我们就违背了继承关系必须是is-a原则。

在java中,虽然没有多继承,但我们可以通过interface来实现多继承。

在python中,没有interface这一语法,但它本身是支持多继承的。

在使用多继承的时候,很容易就会设计不当,导致继承链混乱,影响mro查找,所以,在编程的时候我们的原则就是,能使用其他方法代替多继承就尽量不适用多继承。

这个时候Mixin设计模式就应运而生,Mixin直译理解就是混入、补充的意思,它是多继承的一种。在多继承中,查找顺序是按mro继承链中的顺序进行的。

2.Mixin设计模式实例class Vehicle:

pass

class PlaneMixin:

def fly(self):

print("Flying")

class Airplane(Vehicle, PlaneMixin):

pass

可以看到,上述代码中,Airplane类实现了多继承,在继承链上,它继承了Vehicle类和PlaneMixin类,这里我们遵循Mixin设计模式的要求,在后面添加上后缀Mixin增强代码的可读性。

上述代码可以这么理解,Airplane只是一个Vehicle类,而不是Plane类,而Mixin后缀,它告诉其他读者,这个类是作为功能添加到子类中的,并不是作为父类,它的作用等同于Java中的interface。

这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。

3. 使用Mixin设计模式的原则

在使用Mixin设计模式实现多重继承的时候要特别注意下列几点原则:首先,Mixin类必须表示某一种功能,而不是某一个物体,这点跟java中的Runnable和Callable是一样的。

其次,它表示的责任必须单一,如果有多个功能,我们应该去实现多个Mixin类。

接下来,Mixin类不依赖于子类的实现,且属于抽象类,本身不能实例化,也不能继承Mixin以外的类。

最后,子类即使没有继承Mixin类,也必须照常工作,只是部分功能缺少无法使用。

Java的接口,只提供了“规格”的多重继承。Mixin类则同时提供了“规格”和“实现”的多重继承,使用上相比接口会更加简单。

4. 补充

在其他框架或者语言中,也有类似的Mixin功能,如Ruby,Django,Vue, React等等。

mixin模式 python_python中的Mixin设计模式相关推荐

  1. mixin模式 python_Python中的mixin模式

    MixIn和继承的关系 面向对象三大特征,继承.封装.多态.第一次看到MixIn的时候,弄不懂这个和继承有什么关系/区别.首先,继承是父亲和儿子的关系,而python minxin是混入的意思.虽然, ...

  2. mixin模式 python_python用法——Mixin

    在读werkzeug和flask的源码中,经常能遇到类名中有mixin这个东西.这个东西的用法让我想到了java中的接口名有able的用法.今天我就来看了看这个mixin是什么东西. 学习了pytho ...

  3. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

  4. memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  5. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  6. memento模式_Java中的Memento设计模式

    memento模式 Memento design pattern is one of the behavioral design pattern. Memento design pattern is ...

  7. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  8. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  9. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

最新文章

  1. boost::graph模块实现内部pmap捆绑的测试程序
  2. [hls]m3u8视频如何处理成加密?
  3. 光模块兼容性介绍,如何测试兼容光模块的兼容性?
  4. git克隆远程仓库的时候断电了,使用git-fetch断点续传
  5. Directx11教程(65) 渲染到纹理
  6. Web前端-Vue.js必备框架(一)
  7. Flask实现发送邮件功能
  8. string与stream互相转换
  9. python基础操作---string
  10. LINUX下的21个特殊符号
  11. python攻击局域网电脑_怎么攻击对方电脑?以知对方IP,且对方在线
  12. 关于PPC软件的开发库
  13. xbox手柄测试_【喂你播】苹果官网上架Xbox无线手柄,那么未来会有果牌手柄吗?...
  14. jlink 与 swd 接口定义
  15. xlua 转webgl 遇到的一些错误
  16. 思科交换机接口配置trunk_思科交换机虚拟串口配置VLAN Trunk的步骤
  17. Git报错解决:fatal: unable to access ‘https://github.com/.......‘: OpenSSL SSL_read: Connection was reset
  18. python基础语法及知识点总结
  19. java实现捕鱼达人
  20. 使用python库relate搭建LMS学习管理系统

热门文章

  1. 2023上半年教资笔试时间已出!注意报名时间
  2. 用计算机查看tek示波器波形,用VB编程GPIB通讯控制TEK的TDS3000示波器,怎么把波形图像记录下来?...
  3. 项目实施管理过程中问题自我总结
  4. 电脑连上wifi但不能上网的解决办法
  5. Mysql 中ERROR 1406 (22001): Data too long for column 解决方法
  6. shaderGraph练习(一)------ Fresnel Effect边缘光
  7. 英特尔携手汉朔、微软,释放“AI + 零售”大招!
  8. 多迪课程教研揭秘:优秀的UI设计师具备怎样的好习惯?
  9. 开源项目-学生成绩管理系统
  10. 【转载】人最重要的几个素质/能力