本文實例講述了python3 property裝飾器實現原理與用法。分享給大家供大家參考,具體如下:
學習python的同學,慢慢的都會接觸到裝飾器,裝飾器在python里是功能強大的語法。裝飾器配合python的魔法方法,能實現很多意想不到的功能。廢話不多說,如果你已經掌握了閉包的原理,代碼的邏輯還是可以看明白的,咱們直接進入正題。
property的意義
@property
把一個類的getter方法變成屬性,如果還有setter方法,就在setter方法前面加上
@method.setter
。使用
類屬性=property(getx,setx,delx,desc)
也是可以的。
實現很簡單,那么它背后的原理是什么呢?
Property類的偽代碼如下,里面涉及了__get__、__set__、__delete__魔法方法。Decorator類是裝飾器類,Target是目標類。當你設置裝飾器類的實例對象為目標類的x屬性后,當試圖訪問目標類的x屬性會觸發裝飾器類的__get__方法;當為目標類的x屬性賦值時,會觸發裝飾器類的__setter__方法;嘗試刪除目標類的x屬性時,會觸發裝飾器類的__delete__方法。當訪問Target.x.__doc__,可以打印出裝飾器類的描述文檔。事實上這種裝飾器類也被稱為描述符類。描述符類就是將一個特殊類的實例指派給一個類的屬性。
類屬性實現方式:
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)
裝飾器實現方式:
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
更多關于Python相關內容可查看本站專題:《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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