天天看點

第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儲存到執行個體變量,則方法代碼中隻需一個指派語句就可以。