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()
运行结果:
动物叫...
汪汪
狗拿耗子多管闲事...
我也会游泳,我的姿势是狗刨...
喵喵...
猫是老鼠的天敌,一个也别想跑...
嘎嘎...
我是天生的游泳健将,嘎嘎...