前言
Python 是一种经过精心挑选的通用编程语言,适用于大型和小型应用程序。它支持多种编程范式,包括实用、过程和面向对象编程。Python 的广泛使用得益于其丰富的标准库、易读性以及强大的模块生态系统,使其成为数据科学和机器学习领域的理想选择。
Python 抽象基类(ABC)是面向对象编程中的重要概念,通过 abc 模块实现。抽象基类提供接口蓝图,强制子类实现特定方法。文章详细讲解了如何使用 ABC 和 @abstractmethod 定义抽象类,如何通过继承实现具体方法,以及抽象类不能实例化的限制。同时介绍了抽象属性的定义方式及 @property 与 @abstractmethod 的组合用法,展示了具体方法与抽象方法共存的情况。正确使用 ABC 能增强代码规范性和可维护性。

Python 是一种经过精心挑选的通用编程语言,适用于大型和小型应用程序。它支持多种编程范式,包括实用、过程和面向对象编程。Python 的广泛使用得益于其丰富的标准库、易读性以及强大的模块生态系统,使其成为数据科学和机器学习领域的理想选择。
在面向对象编程中,抽象是一个重要概念。抽象基类(Abstract Base Class, ABC) 是 Python 中实现这一概念的核心机制。
Python 并非完全面向对象的编程语言,但它通过内置的 abc 模块支持抽象类和抽象方法。我们不能直接创建抽象类,但可以使用 abc 模块提供的结构来定义它们。
什么是抽象基类? 抽象基类为具体类提供了蓝图。它们定义了接口规范,但通常不实现具体逻辑,需要子类继承并实现这些方法。
要定义一个带有抽象方法的抽象类,我们需要导入 abc 模块并使用 ABC 基类和 @abstractmethod 装饰器。
from abc import ABC, abstractmethod
class Friend(ABC):
"""抽象基类:定义朋友的基本角色"""
@abstractmethod
def role(self):
"""抽象方法:必须由子类实现"""
pass
abc 模块还提供了 ABCMeta 元类,用于创建抽象类的底层结构。
下面展示如何创建一个抽象类,并通过继承在具体类中实现它。
# 具体子类 1
class Sachin(Friend):
def role(self):
return "Cricket Player"
# 具体子类 2
class Yashwant(Friend):
def role(self):
return "Developer"
# 具体子类 3
class Rishu(Friend):
def role(self):
return "Designer"
# 实例化并调用
friends = [Sachin(), Yashwant(), Rishu()]
for f in friends:
print(f.role())
如果派生类没有遵循抽象类的蓝图(即未实现所有抽象方法),Python 会在实例化时引发错误。
class InvalidFriend(Friend):
# 忘记实现 role 方法
pass
# 尝试实例化会报错:TypeError: Can't instantiate abstract class InvalidFriend with abstract method role
抽象基类的主要作用是确保子类必须遵循特定的结构。从抽象类继承的子类必须实现所有的抽象方法,否则无法被实例化。这有助于维护代码的一致性和规范性。
抽象类不仅可以包含抽象方法,还可以包含具体方法(具有完整定义的普通方法)。子类可以直接使用这些具体方法,也可以重写它们。
class Test(ABC):
@abstractmethod
def abstract_method(self):
pass
def concrete_method(self):
return "This is a concrete method"
class Child(Test):
def abstract_method(self):
return "Implemented"
obj = Child()
print(obj.concrete_method()) # 输出:This is a concrete method
抽象类只能定义而不能实例化,因为它们不是具体的类。Python 不允许为抽象类创建对象,因为没有实际的实现可以调用。
# Details = ABC # 假设 Details 是抽象类
# obj = Details()
# 这将抛出 TypeError: Can't instantiate abstract class Details with abstract methods getname, getrole
除了抽象方法,abc 模块也允许定义抽象属性。虽然 @abstractproperty 曾用于此目的,但在现代 Python 中推荐使用 @property 结合 @abstractmethod。
from abc import ABC, abstractmethod
class Hero(ABC):
@property
@abstractmethod
def hero_name(self):
pass
@property
@abstractmethod
def reel_name(self):
pass
class RDJ(Hero):
@property
def hero_name(self):
return "Iron Man"
@property
def reel_name(self):
return "Robert Downey Jr."
rdj = RDJ()
print(rdj.hero_name) # 访问属性而非调用方法
注意:@abstractproperty 已被弃用,建议始终使用 @property 配合 @abstractmethod。
本文介绍了抽象类、抽象方法和抽象属性的基础知识。Python 的 abc 模块提供了定义抽象基类的基础结构。
ABC 类或 ABCMeta 元类创建抽象类。@abstractmethod 装饰器定义抽象方法。@property 和 @abstractmethod 组合定义抽象属性。通过合理使用 ABC,开发者可以构建更清晰、更具约束力的类层次结构,提高代码的可维护性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online