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

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

时间2025-06-14 16:47:24分类IT科技浏览4139
导读: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
命令提示符被阻止运行怎么办 数据堂公司员工待遇(关于我们 数据堂 Datatang,科研数据共享平台,实验数据,科研数据,科学数据,统计数据,企业数据,行业数据,生活数据,数据集,免费下载)