以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. IDEA连接Redis

    1.创建一个Maven项目 2.在src下的pom.xml文件里,添加相关包引用 <?xml version="1.0" encoding="UTF-8" ...

  2. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".错误的解决方法

    1.今天新git下来的项目报错如下: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: ...

  3. js的模糊查询

    在项目中会用到模糊查询,之前在首页是用的element的tree显示的目录,会有用到搜索,但tree里边会有自带的模糊查询,用filter-node-method方法使用 但上次的项目中 又涉及到不试 ...

  4. css练习一

    总体的html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF- ...

  5. python原类、类的创建过程与方法

    今天为大家介绍一下python中与class 相关的知识-- 获取对象的类名 python是一门面向对象的语言,对于一切接对象的python来说,咱们有必要深入的学习与了解一些知识 首先大家都知道,要 ...

  6. [NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reached

    错误的意思是:已达到可容忍的服务器重连接错误的最大数目.有两个解决思路:一个将这个值设置的更大:然后是排查自己连接服务哪儿出了问题.先说在哪儿设置这个值:在拉取nacos服务的注解配置中,添加一个属性 ...

  7. luogu P2783 有机化学之神偶尔会做作弊 |Tarjan+LCA

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. "第1354题怎么做"&l ...

  8. iOS10 openURL方法跳转到设置界面

    问题 在iOS10之前,跳转到系统设置界面的某个指定界面的方式如下: //打开定位服务界面 NSURL*url=[NSURL URLWithString:@"prefs:root=Priva ...

  9. ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse

    A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...

  10. HDU1429

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...