第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的世界。

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

第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类的更多相关文章

  1. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  2. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

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

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

  4. Python 中的设计模式详解之:策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...

  5. Python中time模块详解(转)

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...

  6. python 中的unicode详解

    通过例子来看问题是比较容易懂的. 首先来看,下面这个是我新建的一个txt文件,名字叫做ivan_utf8.txt,然后里面随便编辑了一些东西. 然后来用控制台打开这个文件,同样也是截图: 这里就是简单 ...

  7. python 中的map 详解

    python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...

  8. 4、Python中的类详解(0601)

    <大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...

  9. python中socket模块详解

    socket模块简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常被叫做"套接字",用于描述IP地址和端口,是一个通信 ...

随机推荐

  1. Sql 解析XML 解决方案

      1.         1.@XML 为数据传入的XML格式 2.         root 为根目录 3.         <A>为对应需要插入的表,详见一对多或者多对多的xml格式 ...

  2. 5.1 ICommand

    1. CanExecute实现 只是将命令绑定到特定控件是不会触发CanExecute方法执行,该方法只是在实例化命令的时候才使用,其余如果需要触发该事件,只能通过后台代码组合触发,如更新一个后台类字 ...

  3. day88:luffy:支付宝同步结果通知&接收异步支付结果&用户购买记录&我的订单

    目录 1.支付宝同步结果通知 2.用户购买记录表 3.接受异步支付结果 4.善后事宜 5.我的订单 1.支付宝同步结果通知 1.get请求支付宝,支付宝返回给你的参数 当用户输入用户名和密码确认支付的 ...

  4. socket connect tcp_v4_connect

    tcp_v4_connect /* This will initiate an outgoing connection. tcp_v4_connect函数初始化一个对外的连接请求,创建一个SYN包并发 ...

  5. TCP粘包问题的解决方案02——利用readline函数解决粘包问题

      主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...

  6. 分布式监控系统之Zabbix基础

    1.为什么要使用监控系统? 我们知道一个系统不管怎么讲它都会出故障,我们为了保证线上业务的最大化的可用性,通常我们要给关键业务做高可用:做高可用的目的是为了让故障发生时,能够有一个备用的解决方案,将故 ...

  7. Markdown 常用语言关键字

    Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...

  8. Ceph OSD服务失效自动启动控制

    前言 服务器上面的服务会因为各种各样的原因失败,磁盘故障,权限问题,或者是服务过载引起超时,这些都可能引起 这个在ceph里面systemctl unit 默认有个on-fail restart,默认 ...

  9. fio测试ceph的filestore

    前言 fio是一个适应性非常强的软件,基本上能够模拟所有的IO请求,是目前最全面的一款测试软件,之前在看德国电信的一篇分享的时候,里面就提到了,如果需要测试存储性能,尽量只用一款软件,这样从上层测试到 ...

  10. JavaScript复习大纲

    1. HTML.CSS和JavaScript各自在网页设计中的作用. 1.HTML生成结构. 2.CSS样式美化. 3.JavaScript的作用: (1) 操作HTML及CSS,让网页具有动态行为. ...