Python抽象屬性使用解讀(@property+@abstractmethod)
1. 為什么要組合使用?
在 BaseLoader 代碼中:
@property
@abstractmethod
def supported_extensions(self) -> list[str]:
"""Return list of supported file extensions."""
pass
這種寫法的核心目的是:定義一個(gè)只讀的、強(qiáng)制子類提供的數(shù)據(jù)接口。
1.1 語義區(qū)別
- 方法 (Method): 表示“動(dòng)作”或“計(jì)算”。調(diào)用需要括號(hào)
()。 - 屬性 (Property): 表示“狀態(tài)”、“特征”或“配置”。調(diào)用不需要括號(hào)。
supported_extensions 本質(zhì)上是 Loader 的一種靜態(tài)特征(它支持什么后綴),而不是一個(gè)動(dòng)作(比如 load())。因此,將其定義為屬性在語義上更準(zhǔn)確。
2. 子類如何實(shí)現(xiàn)?
這是這種模式最強(qiáng)大的地方:它給了子類極大的靈活度。
父類定義了“我需要一個(gè)名為 supported_extensions 的屬性”,子類可以用以下兩種方式之一來滿足:
方式一:使用屬性 (最簡(jiǎn)單推薦)
這也是 Python 相比 Java 的一大優(yōu)勢(shì):抽象屬性可以用普通的類屬性或?qū)嵗龑傩詠砀采w。
class TextLoader(BaseLoader):
# 直接定義一個(gè)列表,甚至不需要寫 @property 方法
supported_extensions = ['.txt', '.md']
這種寫法非常干凈,看起來就像是在寫配置文件。
方式二:使用 @property 方法 (動(dòng)態(tài)計(jì)算)
如果你的屬性值不是固定的,而是需要計(jì)算得來的,可以使用這種方式。
class DynamicLoader(BaseLoader):
@property
def supported_extensions(self) -> list[str]:
# 假設(shè)這里有復(fù)雜的邏輯
import os
return os.environ.get("ALLOWED_EXTS", ".txt").split(",")
3. 完整示例對(duì)比
from abc import ABC, abstractmethod
class Base(ABC):
@property
@abstractmethod
def config(self):
pass
# 實(shí)現(xiàn) 1: 靜態(tài)配置 (推薦)
class SimpleImpl(Base):
config = {"timeout": 30}
# 實(shí)現(xiàn) 2: 動(dòng)態(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. 總結(jié)
使用 @property + @abstractmethod 的好處:
- 接口語義清晰:告訴使用者這是一個(gè)數(shù)據(jù)特征。
- 實(shí)現(xiàn)靈活:子類可以簡(jiǎn)單地用變量賦值,也可以用復(fù)雜的 getter 方法。
- 統(tǒng)一調(diào)用:無論子類怎么實(shí)現(xiàn),使用者都用
obj.field來訪問,不需要關(guān)心背后是變量還是函數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python操作MySql數(shù)據(jù)庫和MsSql數(shù)據(jù)庫
這篇文章介紹了使用Python操作MySql數(shù)據(jù)庫和MsSql數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
Python實(shí)現(xiàn)UDP與TCP通信的示例詳解
UDP是一種無連接的、不可靠的傳輸協(xié)議;TCP是一種可靠的、面向連接的傳輸協(xié)議。這篇文章主要介紹了Python實(shí)現(xiàn)UDP與TCP通信的方法,需要的可以參考一下2023-03-03
Python中不可錯(cuò)過的五個(gè)超有用函數(shù)
在本文中,我們用代碼詳細(xì)說明了Python中超實(shí)用的5個(gè)函數(shù)的重要作用,這些函數(shù)雖然簡(jiǎn)單,但卻是Python中功能最強(qiáng)大的函數(shù),下面一起來看看文章的詳細(xì)介紹吧,希望對(duì)你的學(xué)習(xí)有所幫助2022-01-01
使用celery和Django處理異步任務(wù)的流程分析
Celery是 一個(gè)專注于實(shí)時(shí)處理的任務(wù)隊(duì)列,它還支持任務(wù)調(diào)度。 Celery快速,簡(jiǎn)單,高度可用且靈活。這篇文章主要介紹了使用celery和Django處理異步任務(wù)的流程分析,需要的朋友可以參考下2020-02-02
python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實(shí)例代碼
先前學(xué)習(xí)過,數(shù)字和字符串都可以存儲(chǔ)到變量當(dāng)中,下面這篇文章主要給大家介紹了關(guān)于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

