接口本质是一套协议标准,遵循这个标准的对象就能被调用
接口目的就是为了提高扩展性:
# 协议:支持打开关闭,读写数据 class USB: def open(self): pass def close(self): pass def read(self): pass def write(self): pass # 按USB标准制作鼠标 class Mouse(USB): def open(self): # 打开方法 print("鼠标开机了") def close(self): print("鼠标关闭了") def read(self): print("获取了光标位置") def write(self): # 请忽略鼠标配置 print("鼠标可以写入灯光颜色等数据...") # 至此,Mouse就算是一个合格的USB设备了 # 按USB标准制作键盘 class KeyBoard(USB): def open(self): # 打开方法 print("键盘开机了") def close(self): print("键盘关闭了") def read(self): print("获取了按键字符...") def write(self): # 请忽略鼠标配置 print("键盘可以写入灯光颜色等数据...") # 至此,Mouse就算是一个合格的USB设备了 # ..........其他符合USB接口协议的设备........... def pc(usb_device): usb_device.open() usb_device.read() usb_device.write() usb_device.close() mouse = Mouse() # 将鼠标传给pc pc(mouse) # 鼠标开机了 # 获取了光标位置 # 鼠标不支持写入数据 # 鼠标关闭了 key_board = KeyBoard() pc(key_board) # 键盘开机了 # 获取了按键字符... # 键盘可以写入灯光颜色等数据... # 键盘关闭了 # 上述过程,鼠标键盘的使用都没有改变pc 的代码(使用方式),体现了扩展性和复用性
存在的问题:
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的。
import abc class All_file(metaclass = abc.ABCMeta): all_type = 'file' @abc.abstractmethod def read(self): '子类必须定义读功能' pass @abc.abstractmethod def write(selfs): '子类必须定义读功能' pass class Txt(All_file): def read(self): print('文本数据的读取方法') def write(self): print('文本数据的写入方法') class Sata(All_file): def read(self): print('硬盘数据的读取方法') def write(self): print('硬盘数据的写入方法') class Process(All_file): def read(self): print('进程数据的读取方法') def write(self): print('进程数据的写入方法') #文本文件 text_file = Txt() #硬盘文件 hd_file = Sata() #进程文件 process_file = Process() text_file.read() text_file.write() hd_file.read() hd_file.write() process_file.read() process_file.write()
抽象类与接口
抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计