1. 程式人生 > >【python】@property裝飾器

【python】@property裝飾器

Python內建的@property裝飾器可以把類的方法偽裝成屬性呼叫的方式。也就是本來是Foo.func()的呼叫方法,變成Foo.func的方式。在很多場合下,這是一種非常有用的機制。

class People:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        
if isinstance(age, int): self.__age = age else: raise ValueError @age.deleter def age(self): print("刪除年齡資料!") obj = People("jack", 18) print(obj.age) obj.age = 19 print("obj.age: ", obj.age) del obj.age --------------------------- 列印結果: 18 obj.age:
19 刪除年齡資料!

使用方法:

obj = People("jack", 18)
a = obj.age    # 獲取值
obj.age = 19    # 重新賦值
del obj.age     # 刪除屬性

將一個方法偽裝成為屬性後,就不再使用圓括號的呼叫方式了。而是類似變數的賦值、獲取和刪除方法了。當然,每個動作內部的程式碼細節還是需要你自己根據需求去實現的。

那麼如何將一個普通的方法轉換為一個“偽裝”的屬性呢?

  • 首先,在普通方法的基礎上新增@property裝飾器,例如上面的age()方法。這相當於一個get方法,用於獲取值,決定類似"result = obj.age"
    執行什麼程式碼。該方法僅有一個self引數。
  • 寫一個同名的方法,新增@xxx.setter裝飾器(xxx表示和上面方法一樣的名字),比如例子中的第二個方法。這相當於編寫了一個set方法,提供賦值功能,決定類似"obj.age = ...."的語句執行什麼程式碼。
  • 再寫一個同名的方法,並新增@xxx.delete裝飾器,比如例子中的第三個方法。用於刪除功能,決定"del obj.age "這樣的語句具體執行什麼程式碼。

簡而言之,就是分別將三個方法定義為對同一個屬性的獲取、修改和刪除。還可以定義只讀屬性,也就是隻定義getter方法,不定義setter方法就是一個只讀屬性。

property()函式

除了使用裝飾器的方式將一個方法偽裝成屬性外,Python內建的builtins模組中的property()函式,為我們提供了第二種設定類屬性的手段。

class People:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if isinstance(age, int):
            self.__age = age
        else:
            raise ValueError

    def del_age(self):
        print("刪除年齡資料!")

    # 核心在這句
    age = property(get_age, set_age, del_age, "年齡")    


obj = People("jack", 18)
print(obj.age)
obj.age = 19
print("obj.age:  ", obj.age)
del obj.age

通過語句age = property(get_age, set_age, del_age, "年齡")將一個方法偽裝成為屬性。其效果和裝飾器的方法是一樣的。

property()函式的引數:

  • 第一個引數是方法名,呼叫 例項.屬性 時自動執行的方法
  • 第二個引數是方法名,呼叫 例項.屬性 = XXX時自動執行的方法
  • 第三個引數是方法名,呼叫 del 例項.屬性 時自動執行的方法
  • 第四個引數是字串,呼叫 例項.屬性.__doc__時的描述資訊。