Python抽象屬性使用解讀(@property+@abstractmethod)
1. 為什么要組合使用?
在 BaseLoader 代碼中:
@property
@abstractmethod
def supported_extensions(self) -> list[str]:
"""Return list of supported file extensions."""
pass
這種寫法的核心目的是:定義一個只讀的、強制子類提供的數(shù)據(jù)接口。
1.1 語義區(qū)別
- 方法 (Method): 表示“動作”或“計算”。調用需要括號
()。 - 屬性 (Property): 表示“狀態(tài)”、“特征”或“配置”。調用不需要括號。
supported_extensions 本質上是 Loader 的一種靜態(tài)特征(它支持什么后綴),而不是一個動作(比如 load())。因此,將其定義為屬性在語義上更準確。
2. 子類如何實現(xiàn)?
這是這種模式最強大的地方:它給了子類極大的靈活度。
父類定義了“我需要一個名為 supported_extensions 的屬性”,子類可以用以下兩種方式之一來滿足:
方式一:使用屬性 (最簡單推薦)
這也是 Python 相比 Java 的一大優(yōu)勢:抽象屬性可以用普通的類屬性或實例屬性來覆蓋。
class TextLoader(BaseLoader):
# 直接定義一個列表,甚至不需要寫 @property 方法
supported_extensions = ['.txt', '.md']
這種寫法非常干凈,看起來就像是在寫配置文件。
方式二:使用 @property 方法 (動態(tài)計算)
如果你的屬性值不是固定的,而是需要計算得來的,可以使用這種方式。
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
# 實現(xiàn) 1: 靜態(tài)配置 (推薦)
class SimpleImpl(Base):
config = {"timeout": 30}
# 實現(xiàn) 2: 動態(tài)邏輯
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 的好處:
- 接口語義清晰:告訴使用者這是一個數(shù)據(jù)特征。
- 實現(xiàn)靈活:子類可以簡單地用變量賦值,也可以用復雜的 getter 方法。
- 統(tǒng)一調用:無論子類怎么實現(xiàn),使用者都用
obj.field來訪問,不需要關心背后是變量還是函數(shù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pandas中DataFrame排序及分組排序的實現(xiàn)示例
本文主要介紹了pandas中DataFrame排序及分組排序,pandas中的sort_values()函數(shù)原理類似于SQL中的order by,可以將數(shù)據(jù)集依照某個字段中的數(shù)據(jù)進行排序,下面就來具體介紹一下,感興趣的可以了解一下2024-04-04
selenium+python實現(xiàn)自動化登錄的方法
這篇文章主要介紹了selenium+python實現(xiàn)自動化登錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Python自定義函數(shù)計算給定日期是該年第幾天的方法示例
這篇文章主要介紹了Python自定義函數(shù)計算給定日期是該年第幾天的方法,結合具體實例形式分析了Python日期時間計算相關操作技巧,需要的朋友可以參考下2019-05-05

