本文實例講述了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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

