第7.26節 Python中的@property裝飾器定義屬性訪問方法getter、setter、deleter 詳解程序員
1、 引言
Python中的裝飾器在前面接觸過,老猿尚未深刻展開介紹裝飾器相關的內容,在後面將單獨的章節來介紹。Python總共包括三個內置裝飾器(注意abstractmethod這個裝飾器是從abc模塊導入的,不是內置的),除了前面介紹的類方法裝飾器classmethod、靜態方法裝飾器staticmethod外,還有一個property裝飾器,這個裝飾器與property函數的目的是同樣,只是使用方法上有所不一樣。函數
2、 裝飾器property的語法釋義
Python中的property裝飾器與property函數同樣,是將對屬性的訪問轉換爲對應的方法,所以與property函數,裝飾器也提供了屬性的get、set、del方法。其相關定義都是在類內定義方法的語句前使用,具體語法以下:
一、 get裝飾器:
@property
def 屬性名(self):
方法代碼
return 屬性返回值學習
語法釋義:
1) get裝飾器用於訪問屬性名時執行相關的代碼,必須是@property這個內置裝飾器來定義,全部的裝飾器屬性的get方法都必須是使用這個內置裝飾器。也就是說被 @property 裝飾的方法是獲取屬性值的方法,被裝飾方法的名字會被用作 屬性名;
2) 此處的屬性名與property返回的實例屬性是一個概念,其餘地方使用該屬性名進行訪問,該屬性名在後面定義set方法和del方法時都必須是該名字;
3) 屬性返回值能夠是一個通過方法代碼處理過的值,能夠是某個實例變量或實例變量運算後的值,若是直接返回某個實例變量,則方法代碼能夠沒有。.net
二、 set裝飾器:
@屬性名.setter
def 屬性名(self,value):
方法代碼blog
設置某個實例變量來保存value或value通過運算的值
語法釋義:
1) 本部分的裝飾器是@屬性名.setter,屬性名是前面@property 定義get方法時指定的屬性名,必須一致。「setter」用於指定該裝飾器是set裝飾器,固定用「setter」。被 @屬性名.setter 裝飾的方法是設置屬性值的方法;
2) 注意def的函數名的名字必須與屬性名一致,在此種狀況下,定義屬性的get、set、del的函數名都是屬性名,這個與前面介紹的Python不支持函數的重載看起來是矛盾的,但實際上因爲裝飾器自己也是個函數,裝飾器後面的函數被裝飾器自己這個函數嵌套,所以其做用域僅限於裝飾器函數內,所以重名並不存在覆蓋的狀況;
3) value是屬性要設置的值,若是屬性是通過運算得出,賦值也須要反向倒推,若是函數直接將value保存到實例變量,則方法代碼中只需一個賦值語句就能夠。作用域
三、 del裝飾器:
@屬性名.deleter
def 屬性名(self):
方法代碼get
1) 被 @屬性名.deleter 裝飾的方法是刪除屬性值的方法,屬性名一樣必須是前面get方法定義的屬性名,「deleter 」是固定不變的,其做用就是在外部調用「del 屬性名」時方法當作刪除操做執行。
2) 注意def的函數名的名字必須與屬性名一致。
注意:
1. 經過@property定義一個屬性時,get裝飾器是必須定義的,set和del裝飾器看是否須要再確認是否認義,若是沒有定義setter,該屬性就不能賦值,若是沒有定義deleter,則該屬性不能刪除。
2. 裝飾器定義的屬性名和類實例變量名不要相同,其緣由與前面章節介紹property函數定義屬性的緣由是同樣的。具體請參考本博客的《第7.26節 Python案例詳解:使用property函數定義與實例變量同名的屬性會怎樣?》博客
本節詳細的介紹了property裝飾器的使用語法,注意經過property裝飾器定義屬性時必須至少定義一個getter裝飾器用於讀取屬性的值。老猿認爲,實際上property裝飾器與property函數本質上是一致的,只是定義的語法有所不一樣。下節將結合一個案例對上述知識點進行進一步的介紹。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用於逐步介紹老猿學習Python後總結的學習經驗,這些經驗有助於沒有接觸過Python的程序員能夠很容易地進入Python的世界。
歡迎你們批評指正,謝謝你們關注!class