第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26節(jié) Python中的@property裝飾器定義屬性訪問方法getter、setter、deleter?詳解
一、?? ?引言
Python中的裝飾器在前面接觸過,老猿還沒有深入展開介紹裝飾器相關(guān)的內(nèi)容,在后面將單獨(dú)的章節(jié)來介紹。Python總共包括三個內(nèi)置裝飾器(注意abstractmethod這個裝飾器是從abc模塊導(dǎo)入的,不是內(nèi)置的),除了前面介紹的類方法裝飾器classmethod、靜態(tài)方法裝飾器staticmethod外,還有一個property裝飾器,這個裝飾器與property函數(shù)的目的是一樣,只是使用方法上有所不同。
二、?? ?裝飾器property的語法釋義
Python中的property裝飾器與property函數(shù)一樣,是將對屬性的訪問轉(zhuǎn)換為對應(yīng)的方法,因此與property函數(shù),裝飾器也提供了屬性的get、set、del方法。其相關(guān)定義都是在類內(nèi)定義方法的語句前使用,具體語法如下:
1、?? ?get裝飾器:
@property
def 屬性名(self):
? ? 方法代碼
return 屬性返回值
?? ??? ?語法釋義:
1)?? ?get裝飾器用于訪問屬性名時執(zhí)行相關(guān)的代碼,必須是@property這個內(nèi)置裝飾器來定義,所有的裝飾器屬性的get方法都必須是使用這個內(nèi)置裝飾器。也就是說被 @property 裝飾的方法是獲取屬性值的方法,被裝飾方法的名字會被用做 屬性名;
2)?? ?此處的屬性名與property返回的實(shí)例屬性是一個概念,其他地方使用該屬性名進(jìn)行訪問,該屬性名在后面定義set方法和del方法時都必須是該名字;
3)?? ?屬性返回值可以是一個經(jīng)過方法代碼處理過的值,可以是某個實(shí)例變量或?qū)嵗兞窟\(yùn)算后的值,如果直接返回某個實(shí)例變量,則方法代碼可以沒有。
2、?? ?set裝飾器:
@屬性名.setter
def 屬性名(self,value):
? ? ?方法代碼
? ? ?設(shè)置某個實(shí)例變量來保存value或value經(jīng)過運(yùn)算的值
語法釋義:
1)?? ?本部分的裝飾器是@屬性名.setter,屬性名是前面@property 定義get方法時指定的屬性名,必須一致。“setter”用于指定該裝飾器是set裝飾器,固定用“setter”。被 @屬性名.setter 裝飾的方法是設(shè)置屬性值的方法;
2)?? ?注意def的函數(shù)名的名字必須與屬性名一致,在此種情況下,定義屬性的get、set、del的函數(shù)名都是屬性名,這個與前面介紹的Python不支持函數(shù)的重載看起來是矛盾的,但實(shí)際上由于裝飾器本身也是個函數(shù),裝飾器后面的函數(shù)被裝飾器本身這個函數(shù)嵌套,因此其作用域僅限于裝飾器函數(shù)內(nèi),因此重名并不存在覆蓋的情況;
3)?? ?value是屬性要設(shè)置的值,如果屬性是經(jīng)過運(yùn)算得出,賦值也需要反向倒推,如果函數(shù)直接將value保存到實(shí)例變量,則方法代碼中只需一個賦值語句就可以。
3、?? ?del裝飾器:
@屬性名.deleter
def 屬性名(self):
? ? ?方法代碼
1)?? ?被 @屬性名.deleter 裝飾的方法是刪除屬性值的方法,屬性名同樣必須是前面get方法定義的屬性名,“deleter ”是固定不變的,其作用就是在外部調(diào)用“del 屬性名”時方法當(dāng)做刪除操作執(zhí)行。
2)?? ?注意def的函數(shù)名的名字必須與屬性名一致。
??
注意:
1.?? ?通過@property定義一個屬性時,get裝飾器是必須定義的,set和del裝飾器看是否需要再確認(rèn)是否定義,如果沒有定義setter,該屬性就不能賦值,如果沒有定義deleter,則該屬性不能刪除。
2.?? ?裝飾器定義的屬性名和類實(shí)例變量名不要相同,其原因與前面章節(jié)介紹property函數(shù)定義屬性的原因是一樣的。具體請參考本博客的《第7.26節(jié) Python案例詳解:使用property函數(shù)定義與實(shí)例變量同名的屬性會怎樣?》
本節(jié)詳細(xì)的介紹了property裝飾器的使用語法,注意通過property裝飾器定義屬性時必須至少定義一個getter裝飾器用于讀取屬性的值。老猿認(rèn)為,實(shí)際上property裝飾器與property函數(shù)本質(zhì)上是一致的,只是定義的語法有所不同。下節(jié)將結(jié)合一個案例對上述知識點(diǎn)進(jìn)行進(jìn)一步的介紹。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介紹老猿學(xué)習(xí)Python后總結(jié)的學(xué)習(xí)經(jīng)驗(yàn),這些經(jīng)驗(yàn)有助于沒有接觸過Python的程序員可以很容易地進(jìn)入Python的世界。
歡迎大家批評指正,謝謝大家關(guān)注!
轉(zhuǎn)載于:https://www.cnblogs.com/LaoYuanPython/p/11087688.html
總結(jié)
以上是生活随笔為你收集整理的第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [docker] 04 使用docker
- 下一篇: 借助URLOS快速安装python3网站