新聞中心
1. property裝飾器的基本用法
在講property裝飾器之前,先來(lái)看一個(gè)例子:

成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比長(zhǎng)壽網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式長(zhǎng)壽網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋長(zhǎng)壽地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴(lài)。
- 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
>
這段代碼的主要功能就是通過(guò)word方法返回一個(gè)字符串。而最后一行直接訪(fǎng)問(wèn)了word方法。在Python語(yǔ)言中,任何東西都可視為對(duì)象,方法也不例外。所以直接輸出了word方法的對(duì)象形式。
不過(guò)my.word這種調(diào)用形式,其實(shí)也是訪(fǎng)問(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ì)拋出如下異常:
2. property裝飾器的原理
可能有很多小伙伴感到很神奇,為何直接用@property修飾方法,就可以將Python方法變成屬性呢?本節(jié)就來(lái)詳細(xì)描述property裝飾器的原理。
首先要了解property到底是什么,使用下面的代碼輸出property:
- print(property)
輸出結(jié)果如下:
很明顯,property是一個(gè)類(lèi)。而Python裝飾器其實(shí)就是一個(gè)語(yǔ)法糖,本質(zhì)上是將Python裝飾器作為函數(shù)使用,并將被修飾器修飾的方法/函數(shù)作為參數(shù)值傳入裝飾器函數(shù)。例如,使用@property裝飾word方法,那么就相當(dāng)于使用下面的代碼包裝word方法:
- property(word)
也就是說(shuō),word方法被@property修飾后,就會(huì)變成property類(lèi)的實(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方法的類(lèi)型
- print('word:', type(word))
- def new_word(self):
- return self._word
- # 輸出未被修飾的new_word方法的類(lèi)型
- 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)容:
從輸出結(jié)果可以看出,被@property修飾的word方法的類(lèi)型是property類(lèi),而未被@property修飾的new_word方法的類(lèi)型是function類(lèi)。而且通過(guò)創(chuàng)建property實(shí)例的方式包裝的new_word方法也可以當(dāng)做屬性使用,與下面的代碼等效:
- @property
- def new_word(self):
- return self._word
3. 讓屬性可寫(xiě)、可刪除
用@property修飾的方法是只讀屬性,既不可以寫(xiě),也不可以刪除,否則會(huì)拋出異常。
如果使用my.word = 'new'設(shè)置word屬性,會(huì)拋出如下異常。
如果使用del my.word刪除word屬性,會(huì)拋出如下異常:
其實(shí)property類(lèi)還有setter方法和deleter方法,可以將屬性變成可寫(xiě)和可刪除的,先看下面的代碼:
- class MyClass:
- def __init__(self, word):
- self._word = word
- @property
- def word(self):
- return self._word
- # 設(shè)置可寫(xiě)屬性
- @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方法變成可讀寫(xiě)和可刪除的
- 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變成可寫(xiě)的屬性
- 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)容:
4. 獲得原始方法
用@property修飾的方法,就會(huì)被property實(shí)例取代。那么如何獲取原始的方法呢?這就要通過(guò)property類(lèi)的如下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é)果。
本文名稱(chēng):神奇的Python Property裝飾器:1行代碼讓Python方法秒變屬性
瀏覽路徑:http://m.5511xx.com/article/copheod.html


咨詢(xún)
建站咨詢(xún)
