本文實(shí)例講述了python3 property裝飾器實(shí)現(xiàn)原理與用法。分享給大家供大家參考,具體如下:
學(xué)習(xí)python的同學(xué),慢慢的都會(huì)接觸到裝飾器,裝飾器在python里是功能強(qiáng)大的語(yǔ)法。裝飾器配合python的魔法方法,能實(shí)現(xiàn)很多意想不到的功能。廢話(huà)不多說(shuō),如果你已經(jīng)掌握了閉包的原理,代碼的邏輯還是可以看明白的,咱們直接進(jìn)入正題。
property的意義
@property
把一個(gè)類(lèi)的getter方法變成屬性,如果還有setter方法,就在setter方法前面加上
@method.setter
。使用
類(lèi)屬性=property(getx,setx,delx,desc)
也是可以的。
實(shí)現(xiàn)很簡(jiǎn)單,那么它背后的原理是什么呢?
Property類(lèi)的偽代碼如下,里面涉及了__get__、__set__、__delete__魔法方法。Decorator類(lèi)是裝飾器類(lèi),Target是目標(biāo)類(lèi)。當(dāng)你設(shè)置裝飾器類(lèi)的實(shí)例對(duì)象為目標(biāo)類(lèi)的x屬性后,當(dāng)試圖訪問(wèn)目標(biāo)類(lèi)的x屬性會(huì)觸發(fā)裝飾器類(lèi)的__get__方法;當(dāng)為目標(biāo)類(lèi)的x屬性賦值時(shí),會(huì)觸發(fā)裝飾器類(lèi)的__setter__方法;嘗試刪除目標(biāo)類(lèi)的x屬性時(shí),會(huì)觸發(fā)裝飾器類(lèi)的__delete__方法。當(dāng)訪問(wèn)Target.x.__doc__,可以打印出裝飾器類(lèi)的描述文檔。事實(shí)上這種裝飾器類(lèi)也被稱(chēng)為描述符類(lèi)。描述符類(lèi)就是將一個(gè)特殊類(lèi)的實(shí)例指派給一個(gè)類(lèi)的屬性。
類(lèi)屬性實(shí)現(xiàn)方式:
class Decorator(object): def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel self.__doc__ = doc def __get__(self, instance, owner): if instance is None: return self return self.fget(instance) def __set__(self, instance, value): self.fset(instance, value) def __delete__(self, instance): self.fdel(instance) def getter(self, fget): return Decorator(fget, self.fset, self.fdel, self.__doc__) def setter(self, fset): return Decorator(self.fget, fset, self.fdel, self.__doc__) def deleter(self, fdel): return Decorator(self.fget, self.fset, fdel, self.__doc__) class Target(object): desc = "Amazing pyhton" def __init__(self, attr=5): self._x = attr def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = Decorator(getx,setx,delx,desc)
裝飾器實(shí)現(xiàn)方式:
class Decorator(object): def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel self.__doc__ = doc def __get__(self, instance, owner): if instance is None: return self return self.fget(instance) def __set__(self, instance, value): self.fset(instance, value) def __delete__(self, instance): self.fdel(instance) def getter(self, fget): return Decorator(fget, self.fset, self.fdel, self.__doc__) def setter(self, fset): return Decorator(self.fget, fset, self.fdel, self.__doc__) def deleter(self, fdel): return Decorator(self.fget, self.fset, fdel, self.__doc__) class Target(object): desc = "Amazing pyhton" def __init__(self, attr=5): self._x = attr @Decorator def show(self): return self._x @show.setter def show(self, value): self._x = value @show.deleter def show(self): del self._x
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
