Python学习基础笔记五十六——接口类的多继承
1、多继承问题:
在继承抽象类的过程中,我们尽量避免多继承。
而在继承接口的时候,我们反而鼓励多继承。
方法的实现:
1)在抽象类中,我们可以对一些抽象方法做出基础实现;
2)而在接口类中,任何一个方法都只是一种规范,具体的功能需要子类实现。
例:
# tiger 走路、游泳
# swan 走路 游泳 飞
# eagle 走路 飞
from abc import abstractmethod, ABCMeta
class swim_Animal(metaclass=ABCMeta):
@abstractmethod # 装饰器 语法糖
def swim(self):
pass
class walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):
pass
class fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):
pass
class Tiger(walk_Animal, swim_Animal):
def walk(self):
pass
def swim(self):
pass
class eagle(fly_Animal, walk_Animal):
def fly(self):
pass
def walk(self):
pass
class swan(walk_Animal, swim_Animal, fly_Animal):
def walk(self):
pass
def swim(self):
pass
def fly(self):
pass
接口原则:接口隔离原则: 使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
接口类: 刚好满足接口隔离原则,面向对象开发的思想、规范。
# 一切皆文件
import abc # 利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type = file
@abc.abstractmethod # 定义抽象方法,无需实现功能
def read(self):
子类必须定义读功能
pass
@abc.abstractmethod # 定义抽象方法,无需实现功能
def write(self):
子类必须定义写功能
pass
# class Txt(All_file):
# pass
#
# t1=Txt() #报错,子类没有定义抽象方法
class Txt(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print(文本数据的读取方法)
def write(self):
print(文本数据的读取方法)
class Sata(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print(硬盘数据的读取方法)
def write(self):
print(硬盘数据的读取方法)
class Process(All_file): # 子类继承抽象类,但是必须定义read和write方法
def read(self):
print(进程数据的读取方法)
def write(self):
print(进程数据的读取方法)
wenbenwenjian = Txt()
yingpanwenjian = Sata()
jinchengwenjian = Process()
# 这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
抽象类:也是规范。
一般情况下,都是单继承,能实现的功能都是一样的。所以在父类中可以有一些基础实现。
多继承的情况,由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中。
不管是抽象类还是接口类:面向对象开发的规范。
Python中没有接口类,java中里有接口interface这个概念。能实现多继承。
Python中自带多继承,所以我们直接用class来实现了接口类。
Python中支持抽象类,一般情况下,单继承且可以实现Python代码。
接口类和抽象类都不能实例化。
接口类是一种约束,如果报错就说明代码起作用。
java里的所有类的继承都是单继承,所以抽象类完美地解决了单继承需求中的规范问题。
但对于多继承的需求,由于java本身语法的不支持,所以创建了接口interface这个概念来解决多继承的问题。
