多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 接口 ### 为何要用接口 接口提取了一群类共同的函数,可以把接口当做一个函数的集合。然后让子类去实现接口中的函数。 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。 归一化的好处在于: 1. 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。 2. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合 就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕。 ### 模仿interface 在python中根本就没有一个叫做interface的关键字,如果非要去模仿接口的概念,可以借助第三方模块:[zope.interface模块](http://pypi.python.org/pypi/zope.interface). 也可以使用继承,其实继承有两种用途 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用):实践中,继承的这种用途意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。 二:声明某个子类兼容于某基类,定义一个接口类(模仿java的Interface),接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 ~~~ class Interface:#定义接口Interface类来模仿接口的概念 def read(self): #定接口函数read pass def write(self): #定义接口函数write pass class Txt(Interface): #文本,具体实现read和write def read(self): print('文本数据的读取方法') def write(self): print('文本数据的读取方法') class Sata(Interface): #磁盘,具体实现read和write def read(self): print('硬盘数据的读取方法') def write(self): print('硬盘数据的读取方法') class Process(Interface): def read(self): print('进程数据的读取方法') def write(self): print('进程数据的读取方法') ~~~ 上面的代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不用去实现接口 ,这就用到了抽象类 ## 抽象类 ### **1 什么是抽象类** 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 ### **2 为什么要有抽象类** 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。 * 从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的 * 从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。 ### **3. 在python中实现抽象类** ~~~ #一切皆文件 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): #子类继承抽象类,但是必须定义read和write方法 def read(self): print('文本数据的读取方法') def write(self): print('文本数据的读取方法') class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法 def read(self): print('硬盘数据的读取方法') def write(self): print('硬盘数据的读取方法') wenbenwenjian=Txt() yingpanwenjian=Sata() #这样大家都是被归一化了,也就是一切皆文件的思想 wenbenwenjian.read() yingpanwenjian.write() print(wenbenwenjian.all_type) print(yingpanwenjian.all_type) ~~~ ## **抽象类与接口** 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all\_type)和函数属性(如read、write),而接口只强调函数属性的相似性。 抽象类是一个介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计