第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26節 Python中的@property裝飾器定義屬性訪問方法getter、setter、deleter?詳解
一、?? ?引言
Python中的裝飾器在前面接觸過,老猿還沒有深入展開介紹裝飾器相關的內容,在后面將單獨的章節來介紹。Python總共包括三個內置裝飾器(注意abstractmethod這個裝飾器是從abc模塊導入的,不是內置的),除了前面介紹的類方法裝飾器classmethod、靜態方法裝飾器staticmethod外,還有一個property裝飾器,這個裝飾器與property函數的目的是一樣,只是使用方法上有所不同。
二、?? ?裝飾器property的語法釋義
Python中的property裝飾器與property函數一樣,是將對屬性的訪問轉換為對應的方法,因此與property函數,裝飾器也提供了屬性的get、set、del方法。其相關定義都是在類內定義方法的語句前使用,具體語法如下:
1、?? ?get裝飾器:
@property
def 屬性名(self):
? ? 方法代碼
return 屬性返回值
?? ??? ?語法釋義:
1)?? ?get裝飾器用于訪問屬性名時執行相關的代碼,必須是@property這個內置裝飾器來定義,所有的裝飾器屬性的get方法都必須是使用這個內置裝飾器。也就是說被 @property 裝飾的方法是獲取屬性值的方法,被裝飾方法的名字會被用做 屬性名;
2)?? ?此處的屬性名與property返回的實例屬性是一個概念,其他地方使用該屬性名進行訪問,該屬性名在后面定義set方法和del方法時都必須是該名字;
3)?? ?屬性返回值可以是一個經過方法代碼處理過的值,可以是某個實例變量或實例變量運算后的值,如果直接返回某個實例變量,則方法代碼可以沒有。
2、?? ?set裝飾器:
@屬性名.setter
def 屬性名(self,value):
? ? ?方法代碼
? ? ?設置某個實例變量來保存value或value經過運算的值
語法釋義:
1)?? ?本部分的裝飾器是@屬性名.setter,屬性名是前面@property 定義get方法時指定的屬性名,必須一致。“setter”用于指定該裝飾器是set裝飾器,固定用“setter”。被 @屬性名.setter 裝飾的方法是設置屬性值的方法;
2)?? ?注意def的函數名的名字必須與屬性名一致,在此種情況下,定義屬性的get、set、del的函數名都是屬性名,這個與前面介紹的Python不支持函數的重載看起來是矛盾的,但實際上由于裝飾器本身也是個函數,裝飾器后面的函數被裝飾器本身這個函數嵌套,因此其作用域僅限于裝飾器函數內,因此重名并不存在覆蓋的情況;
3)?? ?value是屬性要設置的值,如果屬性是經過運算得出,賦值也需要反向倒推,如果函數直接將value保存到實例變量,則方法代碼中只需一個賦值語句就可以。
3、?? ?del裝飾器:
@屬性名.deleter
def 屬性名(self):
? ? ?方法代碼
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的世界。
歡迎大家批評指正,謝謝大家關注!
轉載于:https://www.cnblogs.com/LaoYuanPython/p/11087688.html
總結
以上是生活随笔為你收集整理的第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [docker] 04 使用docker
- 下一篇: vue邪道玩法 : 把vue实例存在别的