python3.6 代码篇:简单描述符
描述符介绍:
说的通俗一点,从表现形式来看,一个类如果实现了__get__,__set__,__del__魔法方法(三个方法不一定要全部都实现),并且该类的实例对象通常是另一个类的类属性,那么这个类就是一个描述符。__get__,__set__,__del__的具体声明如下:
__get__(self, instance, owner)
__set__(self, instance, value)
__delete__(self, instance)
其中:
__get__ 用于访问属性。它返回属性的值,或者在所请求的属性不存在的情况下出现 AttributeError 异常。
__set__ 将在属性分配操作中调用。不会返回任何内容。
__delete__ 控制删除操作。不会返回内容。
注意:
只实现__get__方法的对象是非数据描述符,意味着在初始化之后它们只能被读取。而同时实现__get__和__set__的对象是数据描述符,意味着这种属性是可读写的。
下面为Python3.6 中property()【简单描述符】的原理
class myproperty:
def __init__(self,fget=None,fset=None,fdel=None):
self.fget=fget
self.fset=fset
self.fdel=fdel
def __get__(self,instance,owner):
return self.fget(instance)
def __set__(self,instance,value):
self.fset(instance,value)
def __delete__(self,instance):
self.fdel(instance)
新设置一个类,并用一个类属性来引用myproperty():
class A:
def __init__(self,value=10):
self._x=value
def get_x(self):
return self._x
def set_x(self,value):
self._x=value
def del_x(self):
del self._x
x=myproperty(get_x,set_x,del_x)
运行:
>>> a=A() #默认值为10
>>> a._x
10
>>> a.x #调用了__get__魔法方法
10
>>> a.x='xihua' #调用了__set__魔法方法
>>> a._x
'xihua'
>>> del a.x #调用了__delete__魔法方法
>>> a._x #调用__delete__时已经删除a._x,所以出现AttributeError。
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
a._x
AttributeError: 'A' object has no attribute '_x'
萌新试做,有什么不对的请各位大佬指出错误,感谢。