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跳出循环语句continue与break的区别
Aug 25 Python
闭包在python中的应用之translate和maketrans用法详解
Aug 27 Python
python实现超简单端口转发的方法
Mar 13 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python numpy 反转 reverse示例
Dec 04 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
Python class的继承方法代码实例
Feb 14 Python
python关于变量名的基础知识点
Mar 03 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
Pytest单元测试框架如何实现参数化
Sep 05 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
js代码实现微博导航栏
2015/07/30 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
Python内建数据结构详解
2016/02/03 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
详解Python装饰器
2019/03/25 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python: 传递列表副本方式
2019/12/19 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
质量工程师岗位职责
2013/11/16 职场文书
机电一体化自荐信
2013/12/10 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
保洁员岗位职责
2015/02/04 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python