首页IT科技文件描述符的值(python描述符是什么意思)

文件描述符的值(python描述符是什么意思)

时间2025-09-19 08:25:03分类IT科技浏览4956
导读: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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
笔记软件模板(嫌弃笔记软件界面太丑,小伙埋头怒肝1周,开发wordpress个人博客小程序 | 已开源)