python 旧类中使用property特性的方法
在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._value2 else: 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__这些接口时会对其他的值造成影响,因为这个是通用的必须调用的接口。