一、

  1. 继承有两种用途:
  1. """
  2. 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
  3. 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)
  4. 且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
  5. 三、接口隔离原则:使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口
  6. """
  1. """
  2. 接口类:基于同一个接口实现的类 刚好满足接口隔离原则 面向对象开发的思想 规范
  3. 接口类,python 原生不支持 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念
  4. """

 一、接口类单继承

我们来看一段代码去了解为什么需要接口类

  1. class Alipay:
  2. def pay(self,money):
  3. print('支付宝支付了')
  4. class Apppay:
  5. def pay(self,money):
  6. print('苹果支付了')
  7. class Weicht:
  8. def pay(self,money):
  9. print('微信支付了')
  10. def pay(payment,money): # 支付函数,总体负责支付,对应支付的对象和要支付的金额
  11. payment.pay(money)
  12. p=Alipay()
  13. pay(p,200) #支付宝支付了
  1. 这段代码,实现了一个有趣的功能,就是通过一个总体的支付函数,实现了不同种类的支付方式,不同是支付方式作为对象,传入函数中
    但是开发中容易出现一些问题,那就是类中的函数名不一致,就会导致调用的时候找不到类中对应方法,例题如下:
  1. class Alipay:
  2. def paying(self,money): #这里类的方法可能由于程序员的疏忽,写的不是一致的pay,导致后面调用的时候找不到pay
  3. print('支付宝支付了')
  4. class Apppay:
  5. def pay(self,money):
  6. print('苹果支付了')
  7. class Weicht:
  8. def pay(self,money):
  9. print('微信支付了')
  10. def pay(payment,money): # 支付函数,总体负责支付,对应支付的对象和要支付的金额
  11. payment.pay(money)
  12. p=Alipay() #不报错
  13. pay(p,200) #调用执行就会报错,'Alipay' object has no attribute 'pay'
  1. 这时候怎么办呢?可以手动抛异常:NotImplementedError来解决开发中遇到的问题
  1. class payment:
  2. def pay(self):
  3. raise NotImplementedError #手动抛异常
  4. class Alipay:
  5. def paying(self, money): # 这里类的方法不是一致的pay,导致后面调用的时候找不到pay
  6. print('支付宝支付了')
  7. def pay(payment, money): # 支付函数,总体负责支付,对应支付的对象和要支付的金额
  8. payment.pay(money)
  9.  
  10. p = Alipay() # 不报错
  11. pay(p, 200) #调用的时候才会报错 'Alipay' object has no attribute 'pay'
  1. 也可以借用abc模块来处理这种错误
  1. from abc import abstractmethod, ABCMeta #接口类中定义了一些接口名:Pay,且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
  2. class Payment(metaclass=ABCMeta): #抽象出的共同功能Pay
  3. @abstractmethod
  4. def pay(self,money):pass #这里面的pay 来源于下面类中的方法pay,意思把这个方法规范为统一的标准,另外建一个规范类Payment
  5. class Alipay(Payment):
  6. def paying(self, money): #这里出现paying和我们规范的pay不一样,那么在实例化 Alipay的时候就会报错
  7. print('支付宝支付了')
  8. class Weicht(Payment):
  9. def pay(self,money):
  10. print('微信支付了')
  11. def pay(pay_obj,money):
  12. pay_obj.pay(money)
  13. p=Alipay() #实例化的时候就会报错 Can't instantiate abstract class Alipay with abstract methods pay 之前两个例子都是在执行的时候报错,这里不一样的是实例化就会知道是哪里发生错误了
  1. """
  2. 总结:用abc模块装饰后,在实例化的时候就会报错,那么当我们代码很长的时候,就可以早一点预知错误,所以以后在接口类类似问题中用这个模块
  3. 接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,
  4. 可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
  5. """
  1. 二、接口类多继承
  1. from abc import abstractmethod,ABCMeta
  2. class Walk_animal(meteaclass=ABCMeta):
  3. @abstractmethod
  4. def walk(self):
  5. print('walk')
  6. class Swim_animal(meteaclass=ABCMeta):
  7. @abstractmethod
  8. def swim(self):pass
  9. class Fly_animal(metaclass=ABCMeta)
  10. @abstractmethod
  11. def fly(self):pass
  12. #如果正常一个老虎有跑和跑的方法的话,我们会这么做
  13. class Tiger:
  14. def walk(self):pass
  15. def swim(self):pass
  16. #但是我们使用接口类多继承的话就简单多了,并且规范了相同功能
  17. class Tiger(Walk_animal,Swim_animal):pass
  18. #如果此时再有一个天鹅swan,会飞,走,游泳 那么我们这么做
  19. class Swan(Walk_animal,Swim_animal, Fly_animal):pass
  20. # 这就是接口多继承
  1. 三、抽象类
  1. #抽象类
  2. # 抽象类的本质还是类,
  3. # 指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性
  1. """
  2. 1.抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
  3. 2.在继承抽象类的过程中,我们应该尽量避免多继承;
  4. 3.而在继承接口的时候,我们反而鼓励你来多继承接口
  5. # 一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
  6. # 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中
  7.  
  8. """
  1. #一切皆文件
  2. import abc #利用abc模块实现抽象类
  3.  
  4. class All_file(metaclass=abc.ABCMeta):
  5. all_type='file'
  6. @abc.abstractmethod #定义抽象方法,无需实现功能
  7. def read(self):
  8. '子类必须定义读功能'
  9. pass
  10.  
  11. @abc.abstractmethod #定义抽象方法,无需实现功能
  12. def write(self):
  13. '子类必须定义写功能'
  14. pass
  15.  
  16. # class Txt(All_file):
  17. # pass
  18. #
  19. # t1=Txt() #报错,子类没有定义抽象方法
  20.  
  21. class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
  22. def read(self):
  23. print('文本数据的读取方法')
  24.  
  25. def write(self):
  26. print('文本数据的读取方法')
  27.  
  28. class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
  29. def read(self):
  30. print('硬盘数据的读取方法')
  31.  
  32. def write(self):
  33. print('硬盘数据的读取方法')
  34.  
  35. class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
  36. def read(self):
  37. print('进程数据的读取方法')
  38.  
  39. def write(self):
  40. print('进程数据的读取方法')
  41.  
  42. wenbenwenjian=Txt()
  43.  
  44. yingpanwenjian=Sata()
  45.  
  46. jinchengwenjian=Process()
  47.  
  48. #这样大家都是被归一化了,也就是一切皆文件的思想
  49. wenbenwenjian.read()
  50. yingpanwenjian.write()
  51. jinchengwenjian.read()
  52.  
  53. print(wenbenwenjian.all_type)
  54. print(yingpanwenjian.all_type)
  55. print(jinchengwenjian.all_type)

 四、扩展:

  1. 不管是抽象类还是接口类 面向对象的开发规范 所有的接口类和抽象类都不能实例化
  2. java
  3. java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
  4. 但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题
  5. python:
  6. python中没有接口类
  7. python中自带多继承 所以我们直接用class来实现了接口类
  8. python中支持抽象类 一般情况下 单继承 不能实例化
  9. 且可以实现python代码

五、注意

  1. """
  2. 1.多继承问题
  3. 在继承抽象类的过程中,我们应该尽量避免多继承;
  4. 而在继承接口的时候,我们反而鼓励你来多继承接口
  5.  
  6. 2.方法的实现
  7. 在抽象类中,我们可以对一些抽象方法做出基础实现;
  8. 而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现
  9. """

Python--抽象类接口类的更多相关文章

  1. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  2. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  3. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  4. python day - 19 抽象类 接口类 多态 封装

    一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...

  5. python的接口类的思考?

    1.java怎么实现多继承的功效:https://www.cnblogs.com/Berryxiong/p/6142735.html 2.python的接口类和抽象类:https://www.cnbl ...

  6. Python进阶-XVII 非python的接口类、多态、python自己的封装

    1.python模拟java中的接口类 python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念 java : 面向对象编程 设计模式 —— 接口 接口类 : ...

  7. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  8. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

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

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

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

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

随机推荐

  1. django 之 stark组件

    ----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...

  2. OSGI嵌入tomcat应用服务器(gem-web)——tomcat插件环境搭建

    相关的资源下载,参考:https://www.cnblogs.com/dyh004/p/10642769.html 新建普通的plugin工程 新建工程运行环境 在工程中,新建运行环境 新建存放运行环 ...

  3. C#中的IntPtr

    IntPtr是一个类,用于包装调用WindowsAPI函数的指针,根据平台的不同,底层指针可以是32位或64位:它用以表示指针或句柄的平台特定类型,C#中主要用它调用C++\C封装的DLl库:下面主要 ...

  4. 第三章· Redis消息队列

    一.生产消费模型 二.Redis发布消息的两种模式

  5. 关于win10企业版在极域电子教室软件 v4.0 2015 豪华版的全屏控制下如何取得自由

    注.可能因为系统和软件的缘故无法实现 背景 由于在听课过程过于自闭,于是想自己去网上搜点东西看下 于是 经过了一番乱搞 逐渐摸索出了现方法. 方案1: 大力出奇迹 由于电脑在刚刚进入的状态的时候有段时 ...

  6. (二叉树 递归 DFS) leetcode 100. Same Tree

    Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

  7. python的内置模块xml模块方法 xml解析 详解以及使用

    一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...

  8. maven转gradle ,windows错误重定向

    gradle init --type pom --stacktrace > g.log 2>&1

  9. Pandas系列(六)-时间序列详解

    内容目录 1. 基础概述 2. 转换时间戳 3. 生成时间戳范围 4. DatetimeIndex 5. DateOffset对象 6. 与时间序列相关的方法 6.1 移动 6.2 频率转换 6.3 ...

  10. zabbix Server 4.0 部署及之内置item使用案例

    zabbix Server 4.0 部署及之内置item使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix组件架构概述(图片摘自网络) 1>.zabbi ...