zoukankan      html  css  js  c++  java
  • Python面向对象-多重继承之MixIN

    以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告诉我们要优先考虑通过多继承来组合多个功能,而不是设计多层次的复杂的继承关系。

  • 相关阅读:
    125. Valid Palindrome java solutions
    350. Intersection of Two Arrays II java solutions
    ex25.py 各种函数
    习题21,几个简单的加减乘除函数,注意return的用法。
    文件的写入,但是出了一个bug。(Unicode解码错误:‘gbk’编解码器无法解码位置0中的字节0xff:非法多字节序列)
    读写文件(open(), write())
    who, w, whoami以及id命令的使用
    终端设备与tty、chvt、startx命令
    设置自动登录CentOS7
    docker常用命令
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8531570.html
Copyright © 2011-2022 走看看