以Animal类为例,假设要实现以下4种动物:

Dog(狗)、Bat(蝙蝠)、Parrot(鹦鹉)和Ostrich(鸵鸟)

如果按照哺乳类和鸟类来区分的话,可以这样设计:

Animal:

  |--Mammal

    |--Dog

    |--Bat

  |--Bird

    |--Parrot

    |--Ostrich

但是,如果按照能跑和能飞来归类的话,又可以这么设计:

Animal:

  |--Runnable

    |--Dog

    |--Ostrich

  |--Flyable

    |--Parrot

    |--Bat

如果再以宠物类和非宠物类等等规则来划分的话,类的数量会非常非常多的。

python允许我们使用多重继承来设计。

首先,我们仍然将哺乳类和鸟类作为类层次的最主要部分来设计:

>>> class Animal(object):
... pass
...
>>> class Mammal(Animal):
... pass
...
>>> class Bird(Animal):
... pass
...
>>> class Dog(Mammal):
... pass
...
>>> class Bat(Mammal):
... pass
...
>>> class Parrot(Bird):
... pass
...
>>> class Ostrich(Bird):
... pass
...

我们还可以给动物再加上Runnable和Flyable功能。只需要定义好Runnable和Flyable的类,然后对需要Runnable和Flyable功能的动物,直接继承相应的类即可,实现一个子类同时获得多个父类的所有功能:

>>> class Runnable(object):
... pass
...
>>> class Flyable(object):
... pass
...
>>> class Runnable(object):
... def run(self):
... print('能走')
...
>>> class Flyable(object):
... def fly(self):
... print('飞喽')
...
>>> class Dog(Mammal,Runnable):
... pass
...
>>> class Bat(Mammal,Flyable):
... pass
...
>>> d = Dog()
>>> d.run()
能走

MixIN

我们在设计类的时候,建议主线单一继承,例如Ostrich继承自Bird,但是当需要添加额外的功能时,可以通让Ostrich同时继承Bird和Runnable,这样Ostrich就会同时获得Bird和Runnable的所有属性和方法。这种设计通常叫做MixIN。

例如,我们还可以定义肉食动物Carnivorous和植食动物Herbivores,让Dog同时拥有好多的MixIN:

class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
pass

最后,MixIN告诉我们要优先考虑通过多继承来组合多个功能,而不是设计多层次的复杂的继承关系。

Python面向对象-多重继承之MixIN的更多相关文章

  1. python面向对象高级:Mixin多重继承

    继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...

  2. Python 面向对象 —— 多重继承

    多重继承(一个子类同时继承多个父类),容易造成混乱,即如果两个父类又相同的方法名和变量名时,无法确定继承哪一个. 正因如此,Java 等语言中并不支持多重继承(Java 是单继承多接口).Python ...

  3. Python学习笔记之Python的多重继承和MixIn

    多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat - 蝙蝠: Parr ...

  4. Python面向对象——多重继承大揭秘

    1如果如图所示使用多重继承,我们将看到什么 2我们看到了基类被执行了两次Baseclass 3代码验证吧 class BaseClass: num_base_calls = 0 def call_me ...

  5. Python面向对象——多重继承

    1本文的作用 一个从多个父类继承过来的子类,可以访问所有父类的功能. 2图文介绍 3代码验证 class Contact: all_contacts = [] def __init__(self, n ...

  6. Python面向对象 -- slots, @property、多重继承MixIn、定制类(str, iter, getitem, getattr, call, callable函数,可调用对象)、元类(type, metaclass)

    面向对象设计中最基础的3个概念:数据封装.继承和多态 动态给class增加功能 正常情况下,当定义了一个class,然后创建了一个class的实例后,可以在程序运行的过程中给该实例绑定任何属性和方法, ...

  7. python基础——多重继承

    python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...

  8. Python面向对象:杂七杂八的知识点

    为什么有这篇"杂项"文章 实在是因为python中对象方面的内容太多.太乱.太杂,在写相关文章时比我所学过的几种语言都更让人"糟心",很多内容似独立内容.又似相 ...

  9. Python面试题之Python面向对象编程汇总

    面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的.Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念, ...

随机推荐

  1. ArrayList实现原理(JDK1.8)

    ArrayList实现原理(JDK1.8) public class ArrayList<E> extends AbstractList<E> implements List& ...

  2. python的Requests库的使用

    Requests模块: Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量 ...

  3. vue e.path 移动端兼容

    作用 e.path 用来获取点击元素及以上所有父元素的一个数组 问题 当在移动端会有获取不到e.path的问题 不兼容 解决 let path = event.path || (event.compo ...

  4. .NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏

    目       录 1.      概述... 2 2.      演示信息... 2 3.      简单介绍... 3 4.      产品特点... 4 5.      价值体现... 5 1. ...

  5. 灵魂拷问:为什么 Java 字符串是不可变的?

    在逛 programcreek 的时候,发现了一些精妙绝伦的主题.比如说:为什么 Java 字符串是不可变的?像这类灵魂拷问的主题,非常值得深思. 对于绝大多数的初级程序员来说,往往停留在" ...

  6. 测试访问apiserver状态

    目录 前言 创建admin证书和私钥 分发kubeconfig文件 检查集群信息 授权kube-apiserver访问kubelet API的权限 前言 到这里,ETCD集群.kube-nginx + ...

  7. 11-kubernetes RBAC 及授权

    目录 RBAC role 和 clusterrole rolebinding 和 clusterrolebinding 公共权限 clusterrole user 创建测试 创建role案例 创建 r ...

  8. 修改json源码支持datetime序列化

    修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...

  9. 错误 找不到Xcode No such file or directory

  10. Linux下搭建及配置禅道服务器详细过程-包含软件资源

    **1:百度云盘下载: ** 禅道--链接: https://pan.baidu.com/s/1Stu7nOZVIPO5TnpJWjWtiQ 提取码:dnik CentOs操作系统--链接: http ...