Python中的描述符

在Python中,实现对象的get,set或delete方法的类称为描述符描述符是创建属性并将托管属性添加到对象的方法。这些用于保护属性免受更改和任何修改。描述符可以提高程序的可读性和编码技巧。他们可以帮助验证数据。

例如,对于属性年龄,我们只需要正整数值,对于属性字符串,我们只需要字符串值即可,然后描述符提供了一种有效的解决方案。

创建描述符,我们需要__get__,__set__和__delete__方法。

描述符协议

创建描述符,我们需要描述符协议。通过定义以下方法,我们可以有效地管理属性。他们是:

    __get__(self, obj, type=None)    __set__(self, obj, value)
    __delete__(self, obj)

这里,

  • __get__:它从一个对象获取值并返回它。

  • __set__:它为对象设置一个值,但不返回任何值。

  • __delete__:删除对象中的值,不返回任何值。

这些方法通常称为getter和setter方法。Python不提供私有变量,通过使用描述符我们可以实现它们。仅具有__get__方法的描述符称为非数据描述符,它们仅针对类而不是针对实例创建。如果需要,一个类可以具有这些方法以外的其他方法。

创建和调用描述符

我们可以通过多种方式创建描述符:

  1. 创建一个类,并覆盖并使用任何__get __,__ set__和__delete__方法。

  2. 我们可以使用属性类型来创建描述符。

  3. 我们可以通过组合属性类型和python装饰器来创建描述符。

让我们来看看创建描述符的每种方式。

使用类创建描述符

class rk:
	def __init__(self):
		self.value=0
		
	def __get__(self,ob, ty):
		print ("get method")		
		return self.value
		
	def __set__(self, ob, ty):
		self.value = ty
		print("set method",self.value)
	
	def __delete__(self, ob):	
		print("delete method")
		del self.value

class inc:
	r=rk()
	a=inc()print(a.r)
a.r=3
del a.r

输出结果

get method
0
set method 3
delete method

在上面的程序中,get方法将__get__值,__set__方法将值设置为attribute,__delete__方法将删除属性。

使用属性类型创建描述符

通过使用 property() 创建描述符很容易。

创建属性方法的语法为:

    property(fget=None, fset=None, fdel=None, doc=None)

这里,

  • fget:用于获取属性值的函数

  • fset:用于设置属性值的函数

  • fdel:用于删除属性的函数

  • doc:文档字符串

现在,可以使用属性类型编写相同的程序,

class rk:
	def __init__(self):
		self.value=0

	def fget(self):
		print("Get method")
		return self.value

	def fset(self, ty):
		print ("Set method")
		self.value = ty

	def fdel(self):
		print("delete method")
		delself.value      

	name = property(fget, fset, fdel, "I'm the property.")

r=rk()r.name=1
print(r.name)
del r.name

输出结果

Set method
Get method
1
delete method

使用属性类型和装饰器创建描述符

Python装饰器是用于修改函数或类的可调用对象。通过使用装饰器,我们可以修改属性方法。

使用属性类型和装饰器创建描述符的示例:

class rk(object):
	def __init__(self):
		self.i=0

	@property
	def inc(self):
		print("get method")
		return self.i

	@inc.setter
	def inc(self, ty):
		self.i=ty
		print ("Set method",self.i)

	@inc.deleter
	def inc(self):
		print ("delete method")
		del self.i

r=rk()print(r.inc)
r.inc=3
del r.inc

输出结果

get method
0
Set method 3
delete method

描述符的优点

描述符可以提高程序的可读性,并且可以根据我们的要求验证数据。这些是低级功能,通过使用它们,我们可以重用代码。

描述符创建了一种实现私有变量和管理数据的方法。我们可以保护属性免受任何修改和更新。