首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 19:01
  • 2165
  • 7741
blog.csdn.net

第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入门技能树首页概览333596 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/92840491"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top