第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

一、 引言

前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继承关系为标准,在各种调用中,不会显式地指定对象必须包含哪些方法才能用作参数,而是假设所有对象都能完成其工作,在执行时去调用特定协议的方法来执行,因此Python并不推荐在代码中去进行类型检查和属性检查。但为了提供一种可以要求实现对象遵循对应协议、提供所有特定功能集的方法,Python提供了抽象类的机制。

二、 抽象类的作用

抽象类是不能(至少是不应该)实例化的类,其职责是定义子类应实现的一组抽象方法。抽象类不能实例化,从抽象类派生出一个子类,如果没有重写所有抽象方法,则这个类也是抽象的,不能实例化。

抽象类提供了逻辑和实现解耦的能力,即抽象类定义模块提供的功能,在具体实现类来提供实现,这样在不同的模块中通过抽象类来调用,可以用最精简的方式展示出代码之间的逻辑关系,让模块之间的依赖清晰简单。同时,一个抽象类可以有多个实现,让系统的运转更加灵活。而针对抽象类的编程,让每个人可以关注当前抽象类,只关注其方法和描述,而不需要考虑过多的其他逻辑,这对协同开发有很大意义。极简版的抽象类实现,也让代码可读性更高。

三、 Python抽象类的实现

Python为了实现抽象类的支持,支持定义抽象基类(Abstract Base Class),Python使用模块abc提供了抽象基类的支撑能力。抽象基类用于指定子类必须提供哪些功能,却不实现这些功能。抽象基类提供基本类和最基本的抽象方法,可以为子类定义共有的方法,但不需要具体实现。

Python的抽象基类使用有两种方式:真实子类和虚拟子类,本节先介绍真实子类相关的内容,后面章节再介绍虚拟子类。

真实子类就是子类直接从抽象基类派生,抽象基类中可以定义”抽象方法“和“抽象属性”, 抽象基类可以不实现具体的方法,也可以实现部分,子类继承抽象基类的抽象内容并实现,只有完全重写了抽象基类中的“抽象”内容后,才能被实例化,如果有个抽象内容没有重写则子类本身也是抽象类,不能实例化。

四、 抽象基类实现的步骤

1. 导入abc模块的抽象基类ABC和方法abstractmethod:

from abc import ABC, abstractmethod

2. 定义抽象基类:抽象基类要求从ABC类或其子类派生:

class 抽象基类名(ABC):

类体代码

3. 使用abstractmethod装饰器定义抽象方法或抽象属性,类似于类方法定义:

@abstractmethod

def 抽象方法名(self):

抽象方法是子类必须实现的方法,否则子类无法定义。

抽象属性的定义由于相关属性定义的内容还未介绍,本节暂不进行介绍,后面章节再进行补充。

五、 抽象基类的使用

1. 定义子类时指定子类从抽象基类继承;

2. 抽象方法或者抽象基类中定义的实例化方法都可通过super()调用机制来调用;

3. 抽象基类中定义的普通方法可以直接由子类继承使用,其调用方式与普通的类继承访问父类的方法相同。不过老猿推荐使用“super().方法名()”的方式类访问。

本节详细介绍了Python抽象基类相关的概念、抽象基类定义的语法,下节将结合详细的案例进行进一步介绍。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...相关推荐

  1. python正则怎么取反_第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反...

    一.引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩展 ...

  2. java写抽象类的测试_如何使用JUnit在Java中测试抽象类?

    如何使用JUnit在Java中测试抽象类? 我是JUnit的Java测试新手. 我必须使用Java,我想使用单元测试. 我的问题是:我有一个带有一些抽象方法的抽象类. 但是有些方法并不是抽象的. 如何 ...

  3. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

  4. python excel 库 知乎_超全整理|Python 操作 Excel 库 xlwings 常用操作详解!

    来源:早起Python 作者:陈熹.刘早起 大家好,我是早起. 在之前的文章中我们曾详细的讲解了如何使用openpyxl 操作Excel,其实在Python中还有其他可以直接操作 Excel 文件的库 ...

  5. python变量下划线开头_一日一技:python中下划线在不同位置的作用

    在Python的变量名和方法名中,单下划线和双下划线都有各自的含义,有的仅仅是作为约定,用于提示开发人员,而有的则对Python解释器有特殊含义. 你可能有些疑惑,在Python中变量名和方法名中的单 ...

  6. python第三周笔记_第三周 day3 python学习笔记

    1.字符串str类型,不支持修改. 2.关于集合的学习: (1)将列表转成集合set:集合(set)是无序的,集合中不会出现重复元素--互不相同 (2)集合的操作:交集,并集.差集.对称差集.父集.子 ...

  7. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  8. 用python编制一个的类_常见面试题整理--Python概念篇

    前言 众所周知,每年的三月份和四月份都是招聘.找工作的高峰期,所以被人们成为金三银四,所以小编特地整理了一些关于Python的面试题,希望对你们有所帮助! (一).这两个参数是什么意思:*args,* ...

  9. python可以在linux运行_服务器(Linux)上运行python总结

    跑实验换了几次服务器了,每次遇到相似问题都要重新百度,而且每次百度搜索出的顺序都不一样,又得重新找半天,这次把遇到的问题都总结一下. 1.准备 PuTTY和FileZilla FileZilla使用F ...

最新文章

  1. python的中文含义-python __all__ 含义
  2. 【Python】向函数传递列表
  3. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
  4. 深入了解React组件重新渲染的条件和生命周期
  5. 【单片机基础篇】三极管
  6. vue移动端项目中统一滚动条样式与效果
  7. onnx-tensorrt:builtin_op_importers.cpp:628:5: error: ‘IIdentityLayer’ is not a member of ‘nvinfer1’
  8. BP神经网络算法基本原理,BP神经网络计算过程
  9. 新加坡政府企业架构:问题、实践和趋势(2008)
  10. matplotlib绘制正弦曲线
  11. html图片快速轮播特效代码,轻松实现javascript图片轮播特效
  12. 解决电脑速度慢的问题
  13. std::stable_sort 和 std::for_each 的用法[转]
  14. Docker容器域名解析失败
  15. 高斯模糊java代码_Java实现高斯模糊算法处理图像
  16. 根据树状数据渲染树状下拉选项
  17. 2021年制冷与空调设备运行操作免费试题及制冷与空调设备运行操作操作证考试
  18. ​贝叶斯神经网络最新综述
  19. linux定时发信息到微信群聊,Wechat-Timed-Message
  20. Java进阶——如何查看Java字节码

热门文章

  1. 漫画:如何给女朋友解释什么是策略模式?
  2. Python 进阶:全面解读高级特性之切片!
  3. TIOBE 3 月编程语言排行榜:主流 Java、C++ 惨遭嫌弃,Python 势头迅猛
  4. 游戏版号重新发放,开发者可以松口气了!| 畅言
  5. python编程输入,Python编程:输入变量返回nam
  6. mysql读写分离错_MySQL主从同步、读写分离配置步骤、问题解决
  7. 给Java程序员的一些面试建议,大厂面试题汇总
  8. 第 3 章 运行时数据区概述及线程
  9. php 如果判断是utf,php 判断网页是否是utf8编码的方法_PHP教程
  10. java 路由器_一篇文章,了解清楚路由器的各种组网