【python】@property裝飾器
阿新 • • 發佈:2018-11-16
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"
- 寫一個同名的方法,新增
@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__
時的描述資訊。