Python(代码篇)——1:描述符

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'

萌新试做,有什么不对的请各位大佬指出错误,感谢。

posted @ 2019-06-13 14:09  souldom  阅读(103)  评论(0编辑  收藏  举报