Python中定义抽象基类

server/2024/12/15 16:58:20/

What

python中定义可以定义抽象类,和Java中的抽象类是一样的,不能被直接实例化,而是作为一个基类,主要用于定义一组接口规范,接口的实现在继承其的子类中完成,并且要求子类必须实现定义的所有接口,和Java一样如何子类未完全实现父类中的所有接口,那么这个子类也会被定义成为一个抽象类,不能直接实例化。

Why

  • 强制接口一致性
  • 实现多态性
  • 促进代码重用
  • 模板化编程

总之就是好处多多

How

定义抽象类主要有两种方法一种是通过继承ABC类,另一种是直接使用ABCMeta作为元类。

还可以结合使用 @abstractmethod 和 @abstractproperty(Python 3.3 及以上版本推荐使用 @property + @abstractmethod)来定义抽象方法和属性。

下面将依次介绍这两种方法。

继承ABC类

最常用、最简洁的方式,适用于绝大多数情况。只需要让自己的抽象类去继承abc.ABC即可,并使用@abstractmethod装饰器标记应该被子类实现的方法。

python">from abc import ABC, abstractmethod
class MyabstractClass(ABC):@abstractmethoddef my_method(self):pass@property@abstractmethoddef my_property(self):pass

使用ABCMeta元类

python">from abc import ABCMeta, abstractmethodclass MyAbstractClass(metaclass=ABCMeta):@abstractmethoddef my_method(self):pass@property@abstractmethoddef my_property(self):pass
  • @abstractmethod:用于装饰普通方法,表明该方法是抽象的,所有非抽象子类都必须实现它。
  • @property + @abstractmethod:用于定义抽象属性,确保子类提供具体的属性实现。

静态方法和类方法

除了普通的实例方法外,也可以定义抽象的静态方法和类方法。通过组合@abstractmethod 和 @staticmethod 或 @classmethod 来完成。

python">from abc import ABC, abstractmethodclass AbstractBaseClass(ABC):@abstractmethod@staticmethoddef static_method():"""这是一个抽象静态方法"""pass@abstractmethod@classmethoddef class_method(cls):"""这是一个抽象类方法"""pass

注册虚拟子类

有时可能想要声明某个类实现了特定接口,但并不直接继承自那个抽象基类。这时可以使用 register() 方法来注册一个“虚拟子类”。

python">from abc import ABC, abstractmethodclass PluginBase(ABC):@abstractmethoddef load(self, input):passclass LocalPlugin:def load(self, input):return input.read()PluginBase.register(LocalPlugin)  # 注册 LocalPlugin 为 PluginBase 的虚拟子类# 测试是否成功注册
print(issubclass(LocalPlugin, PluginBase))  # 应该输出 True
local_plugin = LocalPlugin()
print(isinstance(local_plugin, PluginBase))  # 应该输出 True

http://www.ppmy.cn/server/150394.html

相关文章

es build 使用配置详解:快速、可扩展的 JavaScript 打包器

引言 es build 是一个快速、可扩展的 JavaScript 打包器和压缩器,它的目标是成为最快的打包器。它使用 Go 编写,可以在几乎瞬间内完成大多数项目的构建。在本文中,我们将深入了解 es build,并探讨其如何实现如此出色的性能。 什…

如何使用 Python 写入文本文件 ?

在Python编程中,写入文本文件是一项基本且重要的操作。 无论是生成日志文件、配置文件,还是进行数据输出,都需要用到这一技能。 下面,我将详细介绍如何使用Python写入文本文件,并提供一些实际开发中的建议和注意事项…

MySQL 记录锁+间隙锁防幻读方案

1. 什么是幻读? 定义: 幻读是指在事务过程中,一个事务执行了某些查询操作后,另一事务插入、删除或更新了满足查询条件的新数据,当第一个事务再次执行相同的查询操作时,结果集出现了“幻觉”&#…

docker tdengine windows快速体验

#拉取镜像 docker pull tdengine/tdengine:2.6.0.34#容器运行 docker run -d --name td2.6 --restartalways -p 6030:6030 -p 6041:6041 -p 6043:6043 -p 6044-6049:6044-6049 -p 6044-6045:6044-6045/udp -p 6060:6060 tdengine/tdengine:2.6.0.34#容器数据持久化到本地 #/va…

双重AEB:将基于规则的方法与多模态大型语言模型相结合,以实现有效的紧急制动(202410)

Dual-AEB: Synergizing Rule-Based and Multimodal Large Language Models for Effective Emergency Braking 双重AEB:将基于规则的方法与多模态大型语言模型相结合,以实现有效的紧急制动 Abstract Automatic Emergency Braking (AEB) systems are a c…

前端切换端口,系统前后端交互就报401错误(未授权)的常见原因

当前端切换端口后,前后端交互出现 401 未授权 错误,通常是因为以下原因: 1. 跨域问题 跨域是最常见的原因。前端端口变化会导致浏览器认为请求是跨域的,后端如果未正确配置 CORS,会拒绝请求。 原因: 不同端…

【图像处理】利用numpy、opencv、python实现车牌检测

| 利用opencv实现车牌检测 整体流程涉及5个部分 图像通道转换对比度增强边缘连接二值化边界区域裁剪 图像通道转换 将RGB图像转换为HSV图像,仅保留V通道。V通道表示颜色的明暗,常用于图像对比度拉伸、直方图均衡化等流程。 原图像: V通…

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小

ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小 文章目录 ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小1. 安装 Times New Roman 字体验证字体是否安装成功 2. 在 Matplotlib 中加载 Times New Roman 字体3. 在 Matplotlib 中使…