python 舊類中使用property特性的方法
阿新 • • 發佈:2018-05-22
eat not int dem getattr delet 調用 ise tex
在python中,我們可以攔截對象的所有特性訪問。通過這種攔截的思路,我們可以在舊式類中實現property方法。
__getattribute__(self, name) #當特性name被訪問時自動調用(只能在新式類中使用) __getattr__(self, name) #當特性name被訪問且對象沒有相應的特性時被自動調用 __setattr__(self, name, value) #當試圖給特性name賦值時會被自動調用 __delattr__(self, name) #當試圖刪除特性name時被自動調用 #*相比於使用property有點復雜,但是特殊方法用途很廣
下面是舉例:
class Demo5(object): def __init__(self): print("這是構造函數") self._value1 = None self._value2 = None def __setattr__(self, key, value): print("try to set the value of the %s property" % (key,)) if key == ‘newValue‘: self._value1, self._value2= value else: print("the property key is not newValue, now create or set it through __dict__") self.__dict__[key] = value def __getattr__(self, item): print("try to get the value of %s " % (item,)) if item == ‘newValue‘: return self._value1, self._value2else: print("the %s item is not exist" % (item,)) #raise AttributeError def __delattr__(self, item): if item == ‘newValue‘: print("delete the value of newValue") del self._value1 del self._value2 else: print("delete other values ,the value name is %s" % item) if __name__ == "__main__": testDemo = Demo5() print(testDemo.newValue) testDemo.newValue = "name","helloworld" print("print the value of property:", testDemo.newValue) print(testDemo.notExist) del testDemo.newValue
下面是結果:
這是構造函數 try to set the value of the _value1 property the property key is not newValue, now create or set it through __dict__ try to set the value of the _value2 property the property key is not newValue, now create or set it through __dict__ try to get the value of newValue (None, None) try to set the value of the newValue property try to set the value of the _value1 property the property key is not newValue, now create or set it through __dict__ try to set the value of the _value2 property the property key is not newValue, now create or set it through __dict__ try to get the value of newValue (‘print the value of property:‘, (‘name‘, ‘helloworld‘)) try to get the value of notExist the notExist item is not exist None delete the value of newValue delete other values ,the value name is _value1 delete other values ,the value name is _value2
**其實,我們可以發現在使用__setatter__ , __getatter__,__delatter__這些接口時會對其他的值造成影響,因為這個是通用的必須調用的接口。
python 舊類中使用property特性的方法