溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python Property裝飾器的作用是什么

發(fā)布時(shí)間:2021-07-09 09:16:53 來(lái)源:億速云 閱讀:188 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“Python Property裝飾器的作用是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1. property裝飾器的基本用法

在講property裝飾器之前,先來(lái)看一個(gè)例子:

class MyClass:     def __init__(self, word):         self._word = word     def word(self):         return self._word  my = MyClass('Hello') print(my.word()) print(my.word)

執(zhí)行這段代碼,會(huì)輸出如下的結(jié)果:

Hello <bound method MyClass.word of <__main__.MyClass object at 0x7fee500b61f0>>

這段代碼的主要功能就是通過(guò)word方法返回一個(gè)字符串。而最后一行直接訪問(wèn)了word方法。在Python語(yǔ)言中,任何東西都可視為對(duì)象,方法也不例外。所以直接輸出了word方法的對(duì)象形式。

不過(guò)my.word這種調(diào)用形式,其實(shí)也是訪問(wèn)屬性的方式,所以這段代碼也可以看做將word方法作為屬性使用,而不是獲取word對(duì)象本身。因此,如果要想將word方法作為屬性使用,就要使用property裝飾器。下面看一下改進(jìn)的代碼:

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方法,這時(shí)就會(huì)將word方法直接變成了屬性,所以可以使用my.word形式調(diào)用word方法,運(yùn)行這段代碼,會(huì)輸出Hello。

我們可以看到,只需要1行代碼,就可以將任何一個(gè)普通的Python方法變成屬性。

如果用@property修飾方法,那么就不能再當(dāng)做方法調(diào)用了,例如,不能再使用my.word()形式調(diào)用word方法了,否則會(huì)拋出如下異常:

Python Property裝飾器的作用是什么

2. property裝飾器的原理

可能有很多小伙伴感到很神奇,為何直接用@property修飾方法,就可以將Python方法變成屬性呢?本節(jié)就來(lái)詳細(xì)描述property裝飾器的原理。

首先要了解property到底是什么,使用下面的代碼輸出property:

print(property)

輸出結(jié)果如下:

<class 'property'>

很明顯,property是一個(gè)類。而Python裝飾器其實(shí)就是一個(gè)語(yǔ)法糖,本質(zhì)上是將Python裝飾器作為函數(shù)使用,并將被修飾器修飾的方法/函數(shù)作為參數(shù)值傳入裝飾器函數(shù)。例如,使用@property裝飾word方法,那么就相當(dāng)于使用下面的代碼包裝word方法:

property(word)

也就是說(shuō),word方法被@property修飾后,就會(huì)變成property類的實(shí)例。

可以用下面的代碼來(lái)演示property裝飾器的原理。在這段代碼中,使用@property修飾了word方法,而new_word方法直接通過(guò)創(chuàng)建property實(shí)例的方式修飾。

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)

執(zhí)行這段代碼,會(huì)輸出如下內(nèi)容:

Python Property裝飾器的作用是什么

從輸出結(jié)果可以看出,被@property修飾的word方法的類型是property類,而未被@property修飾的new_word方法的類型是function類。而且通過(guò)創(chuàng)建property實(shí)例的方式包裝的new_word方法也可以當(dāng)做屬性使用,與下面的代碼等效:

@property def new_word(self):     return self._word

3. 讓屬性可寫、可刪除

用@property修飾的方法是只讀屬性,既不可以寫,也不可以刪除,否則會(huì)拋出異常。

如果使用my.word = 'new'設(shè)置word屬性,會(huì)拋出如下異常。

Python Property裝飾器的作用是什么

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

Python Property裝飾器的作用是什么

其實(shí)property類還有setter方法和deleter方法,可以將屬性變成可寫和可刪除的,先看下面的代碼:

class MyClass:     def __init__(self, word):         self._word = word     @property     def word(self):         return self._word     # 設(shè)置可寫屬性         @word.setter     def word(self, value):         self._word = value     # 設(shè)置可刪除屬性,刪除word屬性時(shí)會(huì)調(diào)用該方法         @word.deleter     def word(self):         print('delete word')         self._word = ''     # 通過(guò)創(chuàng)建property實(shí)例的方式將new_word方法變成可讀寫和可刪除的     def new_word(self):         return self._word     # 將new_word變成只讀的屬性,并且需要將property實(shí)例賦給一個(gè)新的變量,否則會(huì)被后面的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)

執(zhí)行這段代碼啊,會(huì)輸出如下內(nèi)容:

Python Property裝飾器的作用是什么

4. 獲得原始方法

用@property修飾的方法,就會(huì)被property實(shí)例取代。那么如何獲取原始的方法呢?這就要通過(guò)property類的如下3個(gè)方法:

(1)fget:獲取被@property或@property.getter修飾的方法

(2)fset:獲取被@property.setter修飾的方法

(3)fdel:獲取被@property.deleter修飾的方法

在下面的例子中,分別獲取了word屬性的3個(gè)原始方法,并且調(diào)用了這3個(gè)原始方法

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())

執(zhí)行這段代碼,會(huì)輸出如下的結(jié)果。

Python Property裝飾器的作用是什么

“Python Property裝飾器的作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI