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__方法的描述符称为非数据描述符,它们仅针对类而不是针对实例创建。如果需要,一个类可以具有这些方法以外的其他方法。
创建和调用描述符
我们可以通过多种方式创建描述符:
创建一个类,并覆盖并使用任何__get__,__set__和__delete__方法。
我们可以使用属性类型来创建描述符。
我们可以通过组合属性类型和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
描述符的优点
描述符可以提高程序的可读性,并且可以根据我们的要求验证数据。这些是低级功能,通过使用它们,我们可以重用代码。
描述符创建了一种实现私有变量和管理数据的方法。我们可以保护属性免受任何修改和更新。