文件描述符的值(python描述符是什么意思)
python描述符是一个“绑定行为 ”的对象属性 ,在描述符协议中 ,它可以通过方法重写属性的访问 。本质上看,描述符就是一个类 ,只不过它定义了另一个类中属性的访问方式;换句话说 ,一个类可以将属性管理全权委托给描述符类 。
Python中 ,通过使用描述符 ,可以让程序员在引用一个对象属性时自定义要完成的工作。
本质上看 ,描述符就是一个类 ,只不过它定义了另一个类中属性的访问方式 。换句话说 ,一个类可以将属性管理全权委托给描述符类 。
描述符是 Python 中复杂属性访问的基础 ,它在内部被用于实现 property 、方法 、类方法 、静态方法和 super 类型 。
描述符类基于以下 3 个特殊方法 ,换句话说,这 3 个方法组成了描述符协议:
__set__(self, obj, type=None):在设置属性时将调用这一方法(本节后续用 setter 表示);
__get__(self, obj, value):在读取属性时将调用这一方法(本节后续用 getter 表示);
__delete__(self, obj):对属性调用 del 时将调用这一方法 。
其中 ,实现了 setter 和 getter 方法的描述符类被称为数据描述符;反之 ,如果只实现了 getter 方法,则称为非数据描述符 。
实际上 ,在每次查找属性时 ,描述符协议中的方法都由类对象的特殊方法 __getattribute__() 调用(注意不要和 __getattr__() 弄混) 。也就是说,每次使用类对象.属性(或者 getattr(类对象 ,属性值))的调用方式时 ,都会隐式地调用 __getattribute__() ,它会按照下列顺序查找该属性:
验证该属性是否为类实例对象的数据描述符;
如果不是 ,就查看该属性是否能在类实例对象的 __dict__ 中找到;
最后 ,查看该属性是否为类实例对象的非数据描述符 。
为了表达清楚 ,这里举个例子:
#描述符类 classrevealAccess: def__init__(self,initval=None,name=var): self.val=initval self.name=name def__get__(self,obj,objtype): print("Retrieving",self.name) returnself.val def__set__(self,obj,val): print("updating",self.name) self.val=val classmyClass: x=revealAccess(10,var"x") y=5 m=myClass() print(m.x) m.x=20 print(m.x) print(m.y)运行结果为:
Retrievingvar"x" 10 updatingvar"x" Retrievingvar"x" 20 5从这个例子可以看到 ,如果一个类的某个属性有数据描述符 ,那么每次查找这个属性时 ,都会调用描述符的 __get__() 方法,并返回它的值;同样 ,每次在对该属性赋值时 ,也会调用 __set__() 方法 。
注意,虽然上面例子中没有使用 __del__() 方法 ,但也很容易理解 ,当每次使用 del 类对象.属性(或者 delattr(类对象,属性))语句时 ,都会调用该方法 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!