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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

public abstract class Vehicle {
}
public interface Flyable {
    public void fly();
}
public class FlyableImpl implements Flyable {
    public void fly() {
        System.out.println("I am flying");
    }
}
public class Airplane extends Vehicle implements Flyable {
    private flyable;
    public Airplane() {
        flyable = new FlyableImpl();
    }
    public void fly() {
        flyable.fly();
    }
}

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

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

1
2
3
4
5
6
7
8
9

class Vehicle(object):
    pass
class PlaneMixin(object):
    def fly(self):
        print 'I am flying'
class Airplane(Vehicle, PlaneMixin):
    pass

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var PlaneMixin = function() {
  return {
    fly: function() {
      console.log('I am flying');
    }
  }
}
var AirplaneComponent = React.createClass({
  mixins: [PlaneMixin()],
  render: function() {
    return '<h1>Hello</h1>';
  }
});

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

Python文摘:Mixin相关推荐

  1. 一个例子走近 Python 的 Mixin 类:利用 Python 多继承的魔力

    一.引言 这篇博客,是我在看了<Python GUI Programming with Tkinter>第 76 页的小节 Exploiting the power of multiple ...

  2. Python文摘:Requests (Adavanced Usage)

    原文地址:http://docs.python-requests.org/en/latest/user/advanced/#advanced Advanced Usage¶ This document ...

  3. Python文摘:Python with Context Managers

    原文地址:https://jeffknupp.com/blog/2016/03/07/python-with-context-managers/ Of all of the most commonly ...

  4. Python文摘:汉诺塔问题与递归算法

    历史传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜 ...

  5. Python文摘:Unicode and Character Sets

    原文地址:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolut ...

  6. Python中的Mixin详解

    一些闲聊: Mixin是一种设计模式.设计思想 并不是某个特定的class或者函数. Java中的Mixin叫interface Ruby中的Mixin叫Module [2]优点: 1.mixin设计 ...

  7. 浅谈python MRO与Mixin模式

    MRO(Method Resolution Order) In object-oriented programming languages with multiple inheritance, the ...

  8. python进阶16多继承与Mixin

    原创博客链接: python进阶16多继承与Mixin Mixin解释 为了让大家,对这个 Mixin 有一个更直观的理解,摘录了网上一段说明. 民航飞机是一种交通工具,对于土豪们来说直升机也是一种交 ...

  9. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

最新文章

  1. 打开pix4d无有效许可_我市两家企业通过危险废物综合经营许可证专家核查
  2. FLASHBACK DROP TABLE
  3. 隐层元素闪一下_太阳一直依靠什么元素在燃烧,地球上的重元素又是怎么来的?...
  4. linux vnc 改端口号,RHEL6下配置vncserver服务(包括修改vnc端口)
  5. 默纳克系统服务器怎么看抱闸,默纳克抱闸制动力检测怎么关闭
  6. [CodeForces332E]Binary Key
  7. Spring BeanFactory、ApplicationContext IOC 容器获取与使用
  8. 5 --> radius 协议原理解析
  9. 六 创建横断面图及采样线的编辑
  10. java根号n元素的合并排序算法_根号N段合并排序
  11. matlab对数组切片操作
  12. 街区最短路径问题——曼哈顿距离
  13. 图文并茂简介如何查询文章是否被SCI收录以及获取SCI索引号
  14. Three.js使用rotation旋转模型
  15. 女神节快乐 | 用编程语言解密京东云程序媛!
  16. sklearn中lstm_LSTM
  17. win10系统 纯净版 安装
  18. 网易面试一面【游戏测试工程师】
  19. SpringBoot文件上传(图片上传)
  20. 16万字智慧医疗-医院信息化大数据建设 方案

热门文章

  1. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法...
  2. C#接口的作用(经典)
  3. GC DevKit 快速入门
  4. 心得18--JavaWEB国际化类和jstl对应的标签案例分析
  5. activiti前端画图转化_用于Activiti前端显示流程图的插件
  6. catia曲面设计从入门到精通_CATIA V5 曲面设计从入门到精通
  7. python内置类属性_python常用内建属性大全
  8. graphics | 基础绘图系统(五)——plot函数功能再探和低级绘图函数
  9. python 传参数 传引用_Python 函数参数 传引用还是传值
  10. delphi语言转为汇编语言_计算机语言