一、接口类  

  继承的两种用途:

  1、继承基类的方法,并且做出自己的改变或者扩展(代码重用)

  2、声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名)  且并未实现接口中的功能。

  实践中,继承的第一种用法意义不大,有时候常常有害的。因为它使得子类与基类出现强耦合。

  继承的第二种含义非常重要,它叫‘接口继承’。

  接口继承是实质上要求‘做出一个良好的抽象’,这个抽象规定了一个兼容接口,使得外部调用者无需关心内部细节,可以一视同仁的处理实现特定接口的所有对象,这在程序上叫归一化。

  1. #做出一个良好的抽象
  2. class Payment(object):
  3. #规定了一个兼容接口
  4. def pay(self):
  5. pass
  6.  
  7. #微信支付
  8. class WeChatPay(object):
  9. def pay(self,money):
  10. print('微信支付了%s'%money)
  11.  
  12. #支付宝支付
  13. class AliPay(object):
  14. def pay(self,money):
  15. print('支付宝支付了%s'%money)
  16.  
  17. #苹果支付
  18. class ApplePay(object):
  19. def pay(self,money):
  20. print('苹果支付了%s'%money)
  21.  
  22. def pay(obj,money):
  23. obj.pay(money)
  24.  
  25. weixin = WeChatPay()
  26. alipay = AliPay()
  27. applepay = ApplePay()
  28.  
  29. #调用者无需关心具体实现细节,可以一视同仁的处理实现了特定接口的所有对象
  30. pay(weixin,100)
  31. pay(alipay,200)
  32. pay(applepay,300)

  归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合--就像linux的泛文件概念一样,所有的东西都可以当文件处理,不必关心他的内存、磁盘、网络还是屏幕(当然对地层设计者还是要区分‘’字符设备‘’和‘’块设备‘’,然后针对性的设计)

二、抽象类

什么是抽象类:

  与java一样,python也有抽象类的概念,但是需要借用模块来实现,抽象类是一个特殊的类,它只能被继承,不能被实例化。

为什么要有抽象类:

  如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包含数据属性和函数属性。

  比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。

从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

 从实现的角度看,抽象类与普通类的不同之处在于:抽象类中有抽象方法。该类不能被实例化,只能被继承,且子类必须实现抽象方法。这点与接口类类似。不同的是抽象类引入了abc模块:

  1. #一切皆文件
  2. import abc #利用abc模块实现抽象类
  3. class All_file(metaclass=abc.ABCMeta):
  4. all_type='file'
  5. @abc.abstractmethod##定义抽象方法,无需实现功能
  6. def read(self):
  7. '子类必须定义读方法'
  8. pass
  9. @abc.abstractmethod #定义抽象方法,无需实现功能
  10. def write(self):
  11. '子类必须定义写功能'
  12. pass
  13.  
  14. # class Txt(All_file):
  15. # pass
  16. #
  17. # t1=Txt() #报错,子类没有定义抽象方法
  18. class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
  19. def read(self):
  20. print('文本数据的读取方法')
  21.  
  22. def write(self):
  23. print('文本数据的读取方法')
  24.  
  25. class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
  26. def read(self):
  27. print('硬盘数据的读取方法')
  28.  
  29. def write(self):
  30. print('硬盘数据的读取方法')
  31.  
  32. class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
  33. def read(self):
  34. print('进程数据的读取方法')
  35.  
  36. def write(self):
  37. print('进程数据的读取方法')
  38.  
  39. wenbenwenjian=Txt()
  40.  
  41. yingpanwenjian=Sata()
  42.  
  43. jinchengwenjian=Process()
  44.  
  45. #这样大家都是被归一化了,也就是一切皆文件的思想
  46. wenbenwenjian.read()
  47. yingpanwenjian.write()
  48. jinchengwenjian.read()
  49.  
  50. print(wenbenwenjian.all_type)
  51. print(yingpanwenjian.all_type)
  52. print(jinchengwenjian.all_type)

三、抽象类和抽象接口

  抽象类的本质还是类,指的是一组类的相似性,包含数据属性和函数属性,而接口只是强调函数属性的相似性。

  抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 

  在python中,严格意义上并没有接口类这种东西(接口类只要求具备相同函数属性)

  1、多继承问题:

    在继承抽象类的过程中,我们应尽量避免多继承;

    在继承接口的时候,反而鼓励多继承接口

  1.   接口隔离原则:
  2.   使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口
     2、方法实现
  1.   在抽象类中,我们可以对一些抽象方法做出基础实现;
  2.   而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

python 抽象类和接口类的更多相关文章

  1. Python抽象类和接口类

    一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...

  2. python 抽象类与接口类

    几个类 实现的方法都一致的话 就继承同一个父类 在父类写一个公共方法 给子类使用

  3. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  4. python基础 抽象类(接口类)

    Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...

  5. python's twenty-first day for me 抽象类和接口类以及多态

    归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...

  6. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...

  7. Python面向对象 | 抽象类和接口类

    一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...

  8. 抽象类,接口类,封装,property,classmetod,statimethod

    抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...

  9. php 抽象类和接口类

    PHP中抽象类和接口类都是特殊类,通常配合面向对象的多态性一起使用. 相同: ①两者都是抽象类,都不能实例化. ②只有接口类的实现类和抽象类的子类实现了 已经声明的 抽象方法才能被实例化. 不同: ① ...

随机推荐

  1. tomcat服务器配置域名访问项目server.xml

    <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF ...

  2. [VC]strcpy和strncoy的区别

    第一种情况:char* p="how are you ?";char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p ...

  3. UVA 215 Spreadsheet Calculator (模拟)

    模拟题.每个单元格有表达式就dfs,如果有环那么就不能解析,可能会重复访问到不能解析的单元格,丢set里或者数组判下重复. 这种题首先框架要对,变量名不要取的太乱,细节比较多,知道的库函数越多越容易写 ...

  4. POJ 3057 Evacuation(二分匹配)

    分析: 这是一个时间和门的二元组(t,d)和人p匹配的问题,当我们固定d0时,(t,d0)匹配的人数和t具有单调性. t增加看成是多增加了边就行了,所以bfs处理出p到每个d的最短时间,然后把(t,d ...

  5. python_48_Python3中字符编码与转码

    python3默认是Unicode,不用声明# -*- coding:utf-8 -*-,如果声明则是utf-8 unicode='你好' print('utf-8:',unicode.encode( ...

  6. python_28_dictionary补充

    #update:合并两个字典,如果有交叉就覆盖更新,没有交叉的就创建 info={ 'stu1101':'Liu Guannan', 'stu1102':'Wang Ruipu', 'stu1103' ...

  7. MyBatis的discriminator鉴别器根据字段值实现Java中的多态

    <select id="getModelById" resultMap="modelTypeMap"> SELECT id as id, model ...

  8. 使用PinYin4j,获取汉字的拼音字母

    需要导入的文件 <!-- 引入pinyin4J的依赖 --> <dependency> <groupId>com.belerweb</groupId> ...

  9. java POI往word文档中指定位置插入表格

    1.Service  demo import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.a ...

  10. MySQL - GROUP_CONCAT 使用方法

    如上图,我想把结果集中的三行链接成一行,则可这样写:   总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图     ...