本篇內容介紹了“Python Property裝飾器的作用是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在講property裝飾器之前,先來看一個例子:
class MyClass: def __init__(self, word): self._word = word def word(self): return self._word my = MyClass('Hello') print(my.word()) print(my.word)執行這段代碼,會輸出如下的結果:
Hello <bound method MyClass.word of <__main__.MyClass object at 0x7fee500b61f0>>
這段代碼的主要功能就是通過word方法返回一個字符串。而最后一行直接訪問了word方法。在Python語言中,任何東西都可視為對象,方法也不例外。所以直接輸出了word方法的對象形式。
不過my.word這種調用形式,其實也是訪問屬性的方式,所以這段代碼也可以看做將word方法作為屬性使用,而不是獲取word對象本身。因此,如果要想將word方法作為屬性使用,就要使用property裝飾器。下面看一下改進的代碼:
class MyClass: def __init__(self, word): self._word = word # 將word方法變成屬性 @property def word(self): return self._word my = MyClass('Hello') # 輸出Hello print(my.word)這段代碼使用@property修飾了word方法,這時就會將word方法直接變成了屬性,所以可以使用my.word形式調用word方法,運行這段代碼,會輸出Hello。
我們可以看到,只需要1行代碼,就可以將任何一個普通的Python方法變成屬性。
如果用@property修飾方法,那么就不能再當做方法調用了,例如,不能再使用my.word()形式調用word方法了,否則會拋出如下異常:

可能有很多小伙伴感到很神奇,為何直接用@property修飾方法,就可以將Python方法變成屬性呢?本節就來詳細描述property裝飾器的原理。
首先要了解property到底是什么,使用下面的代碼輸出property:
print(property)
輸出結果如下:
<class 'property'>
很明顯,property是一個類。而Python裝飾器其實就是一個語法糖,本質上是將Python裝飾器作為函數使用,并將被修飾器修飾的方法/函數作為參數值傳入裝飾器函數。例如,使用@property裝飾word方法,那么就相當于使用下面的代碼包裝word方法:
property(word)
也就是說,word方法被@property修飾后,就會變成property類的實例。
可以用下面的代碼來演示property裝飾器的原理。在這段代碼中,使用@property修飾了word方法,而new_word方法直接通過創建property實例的方式修飾。
class MyClass: def __init__(self, word): self._word = word @property def word(self): return self._word # 輸出被修飾的word方法的類型 print('word:', type(word)) def new_word(self): return self._word # 輸出未被修飾的new_word方法的類型 print('new_word:', type(new_word)) new_word = property(new_word) print(type(new_word)) my = MyClass("android") print(my.word) print(my.new_word)執行這段代碼,會輸出如下內容:

從輸出結果可以看出,被@property修飾的word方法的類型是property類,而未被@property修飾的new_word方法的類型是function類。而且通過創建property實例的方式包裝的new_word方法也可以當做屬性使用,與下面的代碼等效:
@property def new_word(self): return self._word
用@property修飾的方法是只讀屬性,既不可以寫,也不可以刪除,否則會拋出異常。
如果使用my.word = 'new'設置word屬性,會拋出如下異常。

如果使用del my.word刪除word屬性,會拋出如下異常:

其實property類還有setter方法和deleter方法,可以將屬性變成可寫和可刪除的,先看下面的代碼:
class MyClass: def __init__(self, word): self._word = word @property def word(self): return self._word # 設置可寫屬性 @word.setter def word(self, value): self._word = value # 設置可刪除屬性,刪除word屬性時會調用該方法 @word.deleter def word(self): print('delete word') self._word = '' # 通過創建property實例的方式將new_word方法變成可讀寫和可刪除的 def new_word(self): return self._word # 將new_word變成只讀的屬性,并且需要將property實例賦給一個新的變量,否則會被后面的new_word方法覆蓋 new_word1 = property(new_word) def new_word(self, value): self._word = value # 將new_word變成可寫的屬性 new_word1 = new_word1.setter(new_word) def new_word(self): print('delete new word') # 將new_word變成可刪除的屬性 new_word = new_word1.deleter(new_word) my = MyClass('hello') print(my.word) my.word = 'world' # def word(self, value): print(my.word) del my.word print(my.word) print('---------') my = MyClass('ios') print(my.new_word) my.new_word = 'harmony' print(my.new_word) del my.new_word print(my.new_word)執行這段代碼啊,會輸出如下內容:

用@property修飾的方法,就會被property實例取代。那么如何獲取原始的方法呢?這就要通過property類的如下3個方法:
(1)fget:獲取被@property或@property.getter修飾的方法
(2)fset:獲取被@property.setter修飾的方法
(3)fdel:獲取被@property.deleter修飾的方法
在下面的例子中,分別獲取了word屬性的3個原始方法,并且調用了這3個原始方法
class MyClass: def __init__(self, word): self._word = word @property def word(self): return self._word @word.setter def word(self, value): self._word = value @word.deleter def word(self): print('delete word') self._word = '' fget_word = word.fget fset_word = word.fset fdel_word = word.fdel my = MyClass('android') print(my.fget_word()) my.fset_word('harmony') print(my.fget_word()) print(my.fdel_word())執行這段代碼,會輸出如下的結果。

“Python Property裝飾器的作用是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。