博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python文摘:Mixin
阅读量:5891 次
发布时间:2019-06-19

本文共 2005 字,大约阅读时间需要 6 分钟。

原文地址:https://www.cnblogs.com/aademeng/articles/7262520.html

像C或C++这类语言都支持多重继承,一个子类可以有多个父类,这样的设计常被人诟病。因为继承应该是个”is-a”关系。比如轿车类继承交通工具类,因为轿车是一个(“is-a”)交通工具。一个物品不可能是多种不同的东西,因此就不应该存在多重继承。不过有没有这种情况,一个类的确是需要继承多个类呢?

答案是有,我们还是拿交通工具来举例子,民航飞机是一种交通工具,对于土豪们来说直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,但是轿车没有。所以,我们不可能将飞行功能写在交通工具这个父类中。但是如果民航飞机和直升机都各自写自己的飞行方法,又违背了代码尽可能重用的原则(如果以后飞行工具越来越多,那会出现许多重复代码)。怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破?

不同的语言给出了不同的方法,让我们先来看下Java。Java提供了接口interface功能,来实现多重继承:

现在我们的飞机同时具有了交通工具及飞行器两种属性,而且我们不需要重写飞行器中的飞行方法,同时我们没有破坏单一继承的原则。飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取。

回到主题,Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则。这个怎么理解呢?我们还是看例子吧。

可以看到,上面的Airplane类实现了多继承,不过它继承的第二个类我们起名为PlaneMixin,而不是Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个Mixin类。所以从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。

使用Mixin类实现多重继承要非常小心

  • 首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
  • 其次它必须责任单一,如果有多个功能,那就写多个Mixin类
  • 然后,它不依赖于子类的实现
  • 最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了^_^)

另外提一下,ReactJS也有Mixin功能,而且语法很简洁:

转载于:https://www.cnblogs.com/chickenwrap/p/9998883.html

你可能感兴趣的文章
JSON生成Form表单(四)
查看>>
Cloud Foundry Session Affinity(Sticky Session)的实现
查看>>
什么是RMI,什么是RPC,两者之间的区别是什么?
查看>>
解决跨域问题,实例调用百度地图
查看>>
节点实战技术
查看>>
[ 造轮子 ] 手动封装 AJAX (二) —— ES6 版
查看>>
Javascript基础之-强制类型转换(二)
查看>>
在ABAP里取得一个数据库表记录数的两种方法
查看>>
数据结构-顺序循环队列
查看>>
ECMAScript 6入门读书笔记一
查看>>
UML顺序图(sequence diagram)
查看>>
[LeetCode]合并K个排序链表(Merge k Sorted Lists)
查看>>
APICloud分享图片到微信
查看>>
https证书 websocket配置
查看>>
angularjs初识
查看>>
《JavaScript模式》读书笔记(二)字面量和构造函数
查看>>
带你实现一个 JSONP 实例
查看>>
学校 -> 实习 -> 毕业,前端——我一直在路上
查看>>
Java反射-Getters and Setters
查看>>
ImmutableMap不可使用null的问题
查看>>