← 返回首页
Python3基础教程(三十九)
发表时间:2022-04-08 17:11:25
多重继承

1.多重继承

所谓多重继承,就是一个子类就可以同时获得多个父类的所有功能。

Python语言可没有接口功能,但Python提供了Mixins机制,简单来说Mixins机制指的是子类混合(mixin)不同类的功能,而这些类采用统一的命名规范(例如Mixin后缀),以此标识这些类只是用来混合功能的,并不是用来标识子类的从属"is-a"关系的,而是表示遵守”has-a”的关系。从这一点上来理解与Java语言的接口并没有什么异同。

比如: 我们要分别设计小狗,小猫和小鸭类,我们必须先想清楚小狗,小猫,小鸭的本质是什么?再考虑小狗,小猫,小鸭有哪些功能。

因此我们很容易得出以下结论:

class 小狗 is 动物, has 捉老鼠,游泳。
class 小猫 is 动物, has 捉老鼠
class 小鸭 is 动物, has 游泳

简单来说就是,类(抽象类)侧重描述事物的本质,而接口侧重描述功能,虽然python没有接口,但是以Mixin后缀的类就等同于Java的接口,这一点并没有违反我们设计类时的单一继承原则。

实例:

# -*- coding: utf-8 -*-
# @Time : 2022/4/8 17:31
# @File : multiinherit.py
# @Software : PyCharm


class CatchMouseMixIn(object):
    def catch_mouse(self):
        print('捉老鼠中...')


class SwimMixIn(object):
    def swim(self):
        print('游泳中...')


class Animal(object):
    def bark(self):
        print('动物叫...')


class Dog(Animal, CatchMouseMixIn, SwimMixIn):
    def bark(self):
        print('汪汪')

    def catch_mouse(self):
        print('狗拿耗子多管闲事...')

    def swim(self):
        print('我也会游泳,我的姿势是狗刨...')


class Cat(Animal, CatchMouseMixIn):
    def bark(self):
        print('喵喵...')

    def catch_mouse(self):
        print('猫是老鼠的天敌,一个也别想跑...')


class Duck(Animal, SwimMixIn):
    def bark(self):
        print('嘎嘎...')

    def swim(self):
        print('我是天生的游泳健将,嘎嘎...')


a = Animal()
a.bark()

dog = Dog()
dog.bark()
dog.catch_mouse()
dog.swim()

cat = Cat()
cat.bark()
cat.catch_mouse()

duck = Duck()
duck.bark()
duck.swim()

运行结果:

动物叫...
汪汪
狗拿耗子多管闲事...
我也会游泳,我的姿势是狗刨...
喵喵...
猫是老鼠的天敌,一个也别想跑...
嘎嘎...
我是天生的游泳健将,嘎嘎...