Python @property裝飾器詳解

2020-07-16 10:05:13
既要保護類的封裝特性,又要讓開發者可以使用“物件.屬性”的方式操作操作類屬性,除了使用 property() 函數,Python 還提供了 @property 裝飾器。通過 @property 裝飾器,可以直接通過方法名來存取方法,不需要在方法名後新增一對“()”小括號。

@property 的語法格式如下:

@property
def 方法名(self)
    程式碼塊

例如,定義一個矩形類,並定義用 @property 修飾的方法操作類中的 area 私有屬性,程式碼如下:
class Rect:
    def __init__(self,area):
        self.__area = area
    @property
    def area(self):
        return self.__area
rect = Rect(30)
#直接通過方法名來存取 area 方法
print("矩形的面積是:",rect.area)
執行結果為:

矩形的面積為: 30

上面程式中,使用 @property 修飾了 area() 方法,這樣就使得該方法變成了 area 屬性的 getter 方法。需要注意的是,如果類中只包含該方法,那麼 area 屬性將是一個唯讀屬性。

也就是說,在使用 Rect 類時,無法對 area 屬性重新賦值,即執行如下程式碼會報錯:
rect.area = 90
print("修改後的面積:",rect.area)
執行結果為:

Traceback (most recent call last):
  File "C:UsersmengmaDesktop1.py", line 10, in <module>
    rect.area = 90
AttributeError: can't set attribute


而要想實現修改 area 屬性的值,還需要為 area 屬性新增 setter 方法,就需要用到 setter 裝飾器,它的語法格式如下:

@方法名.setter
def 方法名(self, value):
    程式碼塊

例如,為 Rect 類中的 area 方法新增 setter 方法,程式碼如下:
@area.setter
def area(self, value):
    self.__area = value
再次執行如下程式碼:
rect.area = 90
print("修改後的面積:",rect.area)
執行結果為:

修改後的面積: 90

這樣,area 屬性就有了 getter 和 setter 方法,該屬性就變成了具有讀寫功能的屬性。

除此之外,還可以使用 deleter 裝飾器來刪除指定屬性,其語法格式為:

@方法名.deleter
def 方法名(self):
    程式碼塊

例如,在 Rect 類中,給 area() 方法新增 deleter 方法,實現程式碼如下:
@area.deleter
def area(self):
    self.__area = 0
然後執行如下程式碼:
del rect.area
print("刪除後的area值為:",rect.area)
執行結果為:

刪除後的area值為: 0