国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Python 裝飾器:@property

0
分享至

在 Python 的對象模型中,屬性訪問與方法調(diào)用共享統(tǒng)一的命名空間,但表達(dá)的語義卻不同:屬性描述對象的狀態(tài),方法表達(dá)對象的行為。隨著類設(shè)計(jì)的演進(jìn),原本以屬性公布的值可能需要延遲計(jì)算、加入校驗(yàn)邏輯、動態(tài)生成或與其他屬性保持同步。

如果直接將屬性改寫為方法,不僅破壞既有的 API,還會使調(diào)用方式從:

obj.area

變?yōu)椋?/p>

obj.area()

這種變化違背“接口穩(wěn)定性”原則,不利于代碼維護(hù)。

@property 應(yīng)運(yùn)而生,它可以將無參方法以屬性形式呈現(xiàn),使訪問簡單直觀,但背后仍由方法控制邏輯,同時兼顧封裝性、可擴(kuò)展性和接口穩(wěn)定性。

一、什么是 @property

@property 是 Python 內(nèi)置的裝飾器,用于將實(shí)例方法轉(zhuǎn)換為描述符對象,使其在訪問時觸發(fā)自定義邏輯。其核心目標(biāo)包括:

(1)提供優(yōu)雅的屬性訪問語法

將方法邏輯以屬性形式暴露,例如 obj.area 而不是 obj.area()。

(2)支持基于方法的動態(tài)計(jì)算或延遲求值

允許在屬性訪問時執(zhí)行邏輯,而無需改變 API 約定。

(3)提升封裝性

通過 getter、setter、deleter 控制屬性的讀取、賦值和刪除行為。

(4)保持 API 的向后兼容

當(dāng)原本的公開屬性需要擴(kuò)展邏輯時,可用 property 保持調(diào)用方式不變。

從 Pythonic 風(fēng)格看,@property 是“顯式優(yōu)于隱晦”的體現(xiàn):它讓用戶以簡單的語法訪問有邏輯支持的屬性。

二、@property 工作原理

@property 的底層基于。

在 Python 中,任何實(shí)現(xiàn)以下方法之一的對象都被視為描述符:

__get__(self, instance, owner)

__set__(self, instance, value)

__delete__(self, instance)

描述符對象可以控制某個屬性在 讀取、寫入、刪除 時的行為。

property 本質(zhì)是內(nèi)置類:

    def __delete__(self, instance): ...

當(dāng)我們定義:

        return ...

解釋器會將 x 替換為一個 property 實(shí)例,其內(nèi)部維護(hù)三個方法:

? fget:取值邏輯(getter)

? fset:賦值邏輯(setter)

? fdel:刪除邏輯(deleter)

當(dāng)執(zhí)行:

obj.x

實(shí)際等價于:

A.x.__get__(obj, A)

即調(diào)用 fget(obj)。

類似地:

? 賦值 obj.x = value 等價于 A.x.__set__(obj, value)

? 刪除 del obj.x 等價于 A.x.__delete__(obj)

因此,property 與簡單屬性不同,它是具有行為的托管屬性。

三、核心方法:getter/setter/deleter

property 的三個核心組件共同構(gòu)成完整的托管屬性機(jī)制。

(1)getter:屬性讀取邏輯

最基本的 @property 用法是定義只讀屬性。

        return 3.14159 * self.r ** 2

使用:

print(c.area)     # 訪問 area 屬性時會自動調(diào)用其 getter(觸發(fā) fget 方法)

(2)setter:屬性賦值邏輯

setter必須使用與 getter 同名的裝飾器:

p.age = 20      # 訪問 age 屬性時會自動調(diào)用其 setter(觸發(fā) fset 方法)

說明:@age.setter 并不是隨意命名,而是綁定到同一個 property 對象上,因此名稱必須與 getter 相同。

(3)deleter:屬性刪除行為

用于資源釋放或狀態(tài)清理。

del res.conn   # 訪問 conn 屬性時會自動調(diào)用其 deleter(觸發(fā) fdel 方法)

說明:@conn.deleter 綁定的是同名 property 對象的刪除邏輯方法,確保刪除行為受控。

getter、setter 和 deleter 都必須保持與原 property 對象同名,確保訪問行為受控。

四、典型應(yīng)用場景

(1)將計(jì)算邏輯轉(zhuǎn)換為自然的屬性語法

當(dāng)某個值由其他屬性推導(dǎo)而來時,使用 property 會讓 API 更自然。

        return self.w * self.h

用戶角度:

rect.area   # 比 rect.area() 更直觀

這是最常見的用法:用戶訪問屬性時實(shí)際觸發(fā)方法邏輯。

(2)為屬性添加校驗(yàn)邏輯

避免直接暴露內(nèi)部成員。

        self._c = value

(3)保持 API 向后兼容

當(dāng)屬性從簡單值變成計(jì)算值時,不破壞調(diào)用方式。

初始版本中:

obj.speed = 12  # 簡單屬性

后來想加入單位轉(zhuǎn)換或校驗(yàn):

        self._speed = value

外部代碼無需調(diào)整。

(4)隱藏內(nèi)部實(shí)現(xiàn),保護(hù)成員命名自由

有了 property 之后,可以隨意修改內(nèi)部成員名(如從 value → _value → _internal_value),讓類具有更好的可維護(hù)性與擴(kuò)展性。

五、常見誤區(qū)

誤區(qū) 1:在 getter 內(nèi)訪問自身屬性導(dǎo)致無限遞歸

錯誤示例:

    return self.x   # 再次訪問 property → 無限遞歸

正確寫法:

    return self._x

誤區(qū) 2:誤認(rèn)為 property 會自動緩存

每次訪問都會重新計(jì)算。

如果需要緩存,應(yīng)使用:

from functools import cached_property

誤區(qū) 3:getter、setter 名稱不一致

在使用 property 時,setter 方法必須綁定到同一個 property 對象上,因此名稱必須與 getter 相同,否則不會生效:

    ...

誤區(qū) 4:將 property 當(dāng)作帶參數(shù)的方法使用

property 只能表現(xiàn)為無參屬性:

obj.value(3) # 錯誤

小結(jié)

@property 基于描述符協(xié)議實(shí)現(xiàn),是 Python 中用于創(chuàng)建托管屬性的核心機(jī)制。它讓開發(fā)者以屬性語法訪問方法邏輯,在保持接口簡潔的同時獲得計(jì)算、校驗(yàn)與封裝能力。通過 getter、setter 與 deleter,可以設(shè)計(jì)穩(wěn)定且易維護(hù)的類接口。使用 property 時應(yīng)避免遞歸訪問、濫用復(fù)雜邏輯或錯誤綁定 setter,以保持類結(jié)構(gòu)清晰、設(shè)計(jì)合理。


點(diǎn)贊有美意,贊賞是鼓勵

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
廣東108-78遼籃!球員評分:3人滿分,3人良好,1人不合格

廣東108-78遼籃!球員評分:3人滿分,3人良好,1人不合格

多特體育說
2026-01-11 21:39:19
蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

蔬菜市場遇冷,這3種菜便宜卻沒人買,攤販:現(xiàn)在老百姓太精明了

三農(nóng)雷哥
2026-01-11 17:28:07
萬萬沒想到!李晨會因?yàn)槔先宋兜巧蠠崴,感覺他這輩子很難結(jié)婚了

萬萬沒想到!李晨會因?yàn)槔先宋兜巧蠠崴,感覺他這輩子很難結(jié)婚了

樂悠悠娛樂
2025-12-02 11:01:18
打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

打平就出線!U23國足成亞洲杯大黑馬:賽后澳大利亞球員低下頭顱

足球大腕
2026-01-11 22:02:43
羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

羽壇名將李宗偉:36歲患癌喉嚨全爛,花近1000萬續(xù)命,現(xiàn)狀如何?

豐譚筆錄
2026-01-07 10:59:38
遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

遼寧78-108廣東1喜3憂!小將罕見暴走,姜宇星仍崩,2將難打強(qiáng)隊(duì)

籃球資訊達(dá)人
2026-01-11 22:32:21
2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

2026年春節(jié),要暖到離譜?大年初一撞上七九,老輩人:60年頭回見

叮當(dāng)當(dāng)科技
2026-01-07 13:58:49
愛奇藝、騰訊、優(yōu)酷三大平臺“王炸劇”紛紛登場,誰能登頂劇王?

愛奇藝、騰訊、優(yōu)酷三大平臺“王炸劇”紛紛登場,誰能登頂劇王?

鄉(xiāng)野小珥
2026-01-12 05:57:22
乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

乒球世界排名更新:朱雨玲第5獲28萬,陳幸同重返第3

民哥臺球解說
2026-01-12 05:20:12
氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個月,生理倒拔20歲

氧氣要火了?科學(xué)家發(fā)現(xiàn)寶藏:吸100%純氧3個月,生理倒拔20歲

科學(xué)認(rèn)識論
2026-01-11 17:13:05
開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

開國大將次子羅宇,89年攜香港女星叛逃出國,晚年在美國黯然離世

搜史君
2025-12-31 13:00:10
形勢突變!別了,北約!美國這次玩真的!

形勢突變!別了,北約!美國這次玩真的!

李榮茂
2026-01-12 07:03:16
哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

哈梅內(nèi)伊開始大范圍斷網(wǎng),革命衛(wèi)隊(duì)將與中俄軍演,伊朗進(jìn)入關(guān)鍵期

溫讀史
2026-01-10 07:33:53
拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

拉菲尼亞雙響鎖定勝局,巴薩3-2皇馬衛(wèi)冕西超杯

浮萍足球
2026-01-12 07:24:06
廣西又有2名干部向紀(jì)委投案自首!

廣西又有2名干部向紀(jì)委投案自首!

嶺南美玉
2026-01-12 00:08:15
我只認(rèn)出了萬梓良 ,你們呢 ?

我只認(rèn)出了萬梓良 ,你們呢 ?

小椰的奶奶
2026-01-12 01:45:27
為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

為保護(hù)馬杜羅夫妻戰(zhàn)死的古巴桑切斯上校,被曝光家人都住在美國!

阿龍聊軍事
2026-01-09 20:20:47
伊朗政府宣布全國哀悼三天

伊朗政府宣布全國哀悼三天

界面新聞
2026-01-12 07:03:21
沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

沒想到竟然這么多工作需要保密的!網(wǎng)友:不讓看非看被一槍斃了

另子維愛讀史
2025-12-08 20:58:22
汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

汪小菲為什么發(fā)瘋,發(fā)瘋背后是流量斷崖式的下跌

調(diào)侃國際觀點(diǎn)
2026-01-11 18:41:24
2026-01-12 08:04:49
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國的差距也許還在拉大”

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國足形勢:末輪不負(fù)泰國即確保晉級

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財(cái)經(jīng)要聞

外賣平臺"燒錢搶存量市場"迎來終局?

汽車要聞

2026款宋Pro DM-i長續(xù)航補(bǔ)貼后9.98萬起

態(tài)度原創(chuàng)

手機(jī)
教育
本地
房產(chǎn)
數(shù)碼

手機(jī)要聞

真我 Neo8 參數(shù)曝光,驍龍 8 Gen5 、8000mAh電池

教育要聞

1分鐘說清!山西工程科技職業(yè)大學(xué)專業(yè)錄取線

本地新聞

云游內(nèi)蒙|“包”你再來?一座在硬核里釀出詩意的城

房產(chǎn)要聞

66萬方!4755套!三亞巨量房源正瘋狂砸出!

數(shù)碼要聞

科技有AI,連接全球:海信家電參展CES 2026,定義智慧生活新圖景

無障礙瀏覽 進(jìn)入關(guān)懷版