Python面向对象之接口、抽象类与多态详解


Posted in Python onAugust 27, 2018

本文实例讲述了Python面向对象之接口、抽象类与多态。分享给大家供大家参考,具体如下:

接口类

继承有两种用途:

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

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

接口主要是java等语言中的概念,python中并没有明确的限定

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
  @abstractmethod
  def pay(self,money):
    pass
class Wechatpay(Payment):
  def fuqian(self,money):
    print('微信支付了%s元'%money)
p = Wechatpay() #不调就报错了

抽象类

什么是抽象类

与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

为什么要有抽象类

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

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

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

从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的,即将揭晓答案

在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):
#   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)

抽象类与接口类

抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

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

在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。

1. 多继承问题

在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口

接口隔离原则:

使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

2. 方法的实现

在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

多继承遍历顺序:

  • 经典类:深度优先
  • 新式类:广度优先

继承的作用

  • 减少代码的重用
  • 提高代码可读性
  • 规范编程模式

抽象类与接口类

1.多继承问题

在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口

2.方法的实现

在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

多态

多态指的是一类事物有多种形态

多态性

一 什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)

多态性是指在不考虑实例类型的情况下使用实例

多态性分为静态多态性和动态多态性

  • 静态多态性:如任何类型都可以用运算符+进行运算
  • 动态多态性:如下
peo=People()
dog=Dog()
pig=Pig()
#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()
#更进一步,我们可以定义一个统一的接口来使用
def func(obj):
  obj.talk()

鸭子类型

Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子'

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python发送伪造的arp请求
Jan 09 Python
Python标准库urllib2的一些使用细节总结
Mar 16 Python
利用Python绘制MySQL数据图实现数据可视化
Mar 30 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
Python @property使用方法解析
Sep 17 Python
python groupby 函数 as_index详解
Dec 16 Python
python能否java成为主流语言吗
Jun 22 Python
python tqdm实现进度条的示例代码
Nov 10 Python
Python与C/C++的相互调用案例
Mar 04 Python
python实现随机漫步算法
Aug 27 #Python
Python3随机漫步生成数据并绘制
Aug 27 #Python
python如何生成各种随机分布图
Aug 27 #Python
python随机数分布random测试
Aug 27 #Python
pycharm安装和首次使用教程
Aug 27 #Python
Windows下PyCharm安装图文教程
Aug 27 #Python
python 3.7.0 安装配置方法图文教程
Aug 27 #Python
You might like
PHP 动态随机生成验证码类代码
2010/04/09 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
python非递归全排列实现方法
2017/04/10 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
python实现决策树分类
2018/08/30 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Django实现网页分页功能
2019/10/31 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Python解析微信dat文件的方法
2020/11/30 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript