Python抽象属性使用解读(@property+@abstractmethod)

 更新时间:2025年12月29日 09:24:24   作者:nvd11  
文章介绍了使用`@property`和`@abstractmethod`组合的Python编程模式,这种模式定义了一个只读的、强制子类提供的数据接口,子类可以通过属性或`@property`方法来实现这个接口,提供了灵活性和统一的调用方式

1. 为什么要组合使用?

BaseLoader 代码中:

@property
@abstractmethod
def supported_extensions(self) -> list[str]:
    """Return list of supported file extensions."""
    pass

这种写法的核心目的是:定义一个只读的、强制子类提供的数据接口。

1.1 语义区别

  • 方法 (Method): 表示“动作”或“计算”。调用需要括号 ()
  • 属性 (Property): 表示“状态”、“特征”或“配置”。调用不需要括号。

supported_extensions 本质上是 Loader 的一种静态特征(它支持什么后缀),而不是一个动作(比如 load())。因此,将其定义为属性在语义上更准确。

2. 子类如何实现?

这是这种模式最强大的地方:它给了子类极大的灵活度。

父类定义了“我需要一个名为 supported_extensions 的属性”,子类可以用以下两种方式之一来满足:

方式一:使用属性 (最简单推荐)

这也是 Python 相比 Java 的一大优势:抽象属性可以用普通的类属性或实例属性来覆盖。

class TextLoader(BaseLoader):
    # 直接定义一个列表,甚至不需要写 @property 方法
    supported_extensions = ['.txt', '.md']

这种写法非常干净,看起来就像是在写配置文件。

方式二:使用 @property 方法 (动态计算)

如果你的属性值不是固定的,而是需要计算得来的,可以使用这种方式。

class DynamicLoader(BaseLoader):
    @property
    def supported_extensions(self) -> list[str]:
        # 假设这里有复杂的逻辑
        import os
        return os.environ.get("ALLOWED_EXTS", ".txt").split(",")

3. 完整示例对比

from abc import ABC, abstractmethod

class Base(ABC):
    @property
    @abstractmethod
    def config(self):
        pass

# 实现 1: 静态配置 (推荐)
class SimpleImpl(Base):
    config = {"timeout": 30}

# 实现 2: 动态逻辑
class ComplexImpl(Base):
    @property
    def config(self):
        return {"timeout": self._calculate_timeout()}

    def _calculate_timeout(self):
        return 100

# 使用
s = SimpleImpl()
print(s.config) # {'timeout': 30}

c = ComplexImpl()
print(c.config) # {'timeout': 100}

4. 总结

使用 @property + @abstractmethod 的好处:

  1. 接口语义清晰:告诉使用者这是一个数据特征。
  2. 实现灵活:子类可以简单地用变量赋值,也可以用复杂的 getter 方法。
  3. 统一调用:无论子类怎么实现,使用者都用 obj.field 来访问,不需要关心背后是变量还是函数。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Python操作MySql数据库和MsSql数据库

    使用Python操作MySql数据库和MsSql数据库

    这篇文章介绍了使用Python操作MySql数据库和MsSql数据库的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Python实现UDP与TCP通信的示例详解

    Python实现UDP与TCP通信的示例详解

    UDP是一种无连接的、不可靠的传输协议;TCP是一种可靠的、面向连接的传输协议。这篇文章主要介绍了Python实现UDP与TCP通信的方法,需要的可以参考一下
    2023-03-03
  • Python中不可错过的五个超有用函数

    Python中不可错过的五个超有用函数

    在本文中,我们用代码详细说明了Python中超实用的5个函数的重要作用,这些函数虽然简单,但却是Python中功能最强大的函数,下面一起来看看文章的详细介绍吧,希望对你的学习有所帮助
    2022-01-01
  • 使用celery和Django处理异步任务的流程分析

    使用celery和Django处理异步任务的流程分析

    Celery是 一个专注于实时处理的任务队列,它还支持任务调度。 Celery快速,简单,高度可用且灵活。这篇文章主要介绍了使用celery和Django处理异步任务的流程分析,需要的朋友可以参考下
    2020-02-02
  • Python datetime库函数的示例详解

    Python datetime库函数的示例详解

    datetime 是 Python 内置的日期时间处理库,它包含了处理日期、时间、时间间隔等的类和函数,这篇文章主要介绍了Python datetime库函数的详解,需要的朋友可以参考下
    2023-07-07
  • Python如何爬取b站热门视频并导入Excel

    Python如何爬取b站热门视频并导入Excel

    这篇文章主要介绍了Python如何爬取b站热门视频并导入Excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python使用wxPython打造文件批量压缩工具

    Python使用wxPython打造文件批量压缩工具

    在日常工作中,我们经常需要将多个文件打包压缩,下面我们就来看看如何使用 Python 的 wxPython 库,创建一个功能强大的图形化文件批量压缩工具吧
    2025-11-11
  • Python中的程序流程控制语句

    Python中的程序流程控制语句

    这篇文章主要介绍了Python中的程序流程控制语句,本篇博客将会讲述一下Python语言中的流程控制语句,在高中我们数学中学过程序流程题,下面我们来看看python中得流程语句会是怎么样呢,需要的小伙伴可以参考一下
    2022-02-02
  • python中数字列表转化为数字字符串的实例代码

    python中数字列表转化为数字字符串的实例代码

    先前学习过,数字和字符串都可以存储到变量当中,下面这篇文章主要给大家介绍了关于python中数字列表转化为数字字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • python自动化办公操作excel的示例详解

    python自动化办公操作excel的示例详解

    这篇文章主要为大家详细介绍了如何利用python来实现自动化办公操作excel文件进行各种样式展示,并自动发送文件给"老板"的邮箱,希望对大家有所帮助
    2024-03-03

最新评论