鱼C论坛

 找回密码
 立即注册
查看: 1579|回复: 3

[已解决]属性访问相关的魔法方法和描述符是什么关系

[复制链接]
发表于 2023-8-30 14:16:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
__get__ <--> __getattr__, __getattribute__
__set__ <--> __setattr__
__delet__ <--> __selattr__

属性访问相关的魔法方法和描述符似乎能一一对应,
麻烦发表介绍一下用法和区别
最佳答案
2023-10-23 05:45:43
描述符的调用前提是它需要被定义为另一个类的类属性。

描述符和属性访问相关的魔法方法不会产生冲突,因为它们的调用顺序是有规定的。

它们的调用顺序规定如下:

1. 如果一个类定义了__getattribute__()方法,那么这个方法会在每次属性访问时被调用,无论属性是否存在,无论是否是描述符。

2. 如果__getattribute__()抛出AttributeError异常,那么__getattr__()方法会被调用。

3. 描述符的__get__()和__set__()方法的调用优先级高于实例字典中的数据,也就是说,如果一个类定义了描述符,那么在访问或设置这个描述符的属性时,描述符的方法会被调用。

4. 数据描述符(定义了__get__()和__set__()方法的描述符)的优先级高于非数据描述符(只定义了__get__()方法的描述符),也就是说,如果一个类同时定义了数据描述符和非数据描述符,那么在访问或设置这个描述符的属性时,数据描述符的方法会被调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-30 14:17:13 | 显示全部楼层
属性访问相关的魔法方法和描述符之间存在一一对应的关系。下面是它们的用法和区别:

1. __get__和__getattr__、__getattribute__:
   · __get__是描述符协议中的一个方法,用于定义获取属性值的行为。当一个属性被访问时,如果该属性是一个描述符对象的实例,Python会调用该描述符对象的__get__方法来获取属性值。
   · __getattr__是一个特殊方法,用于在属性访问失败时被调用。如果一个对象没有指定的属性,Python会调用该对象的__getattr__方法。
   · __getattribute__是一个特殊方法,用于在属性访问时被调用。无论属性是否存在,Python都会调用该对象的__getattribute__方法。

2. __set__和__setattr__:
   · __set__是描述符协议中的一个方法,用于定义设置属性值的行为。当一个属性被赋值时,如果该属性是一个描述符对象的实例,Python会调用该描述符对象的__set__方法来设置属性值。
   · __setattr__是一个特殊方法,用于在属性赋值时被调用。当一个对象的属性被赋值时,无论属性是否存在,Python都会调用该对象的__setattr__方法。

3. __delete__和__delattr__:
   · __delete__是描述符协议中的一个方法,用于定义删除属性的行为。当一个属性被删除时,如果该属性是一个描述符对象的实例,Python会调用该描述符对象的__delete__方法来删除属性。
   · __delattr__是一个特殊方法,用于在属性删除时被调用。当一个对象的属性被删除时,无论属性是否存在,Python都会调用该对象的__delattr__方法。

总结:
· 描述符是一种特殊的对象,它通过定义__get__、__set__和__delete__方法来控制属性的访问、赋值和删除行为。
· __getattr__、__getattribute__、__setattr__和__delattr__是特殊方法,用于处理对象的属性访问、赋值和删除操作。
· 描述符和特殊方法可以结合使用,以实现对属性访问的自定义控制和处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 14:23:02 | 显示全部楼层
那调用描述符前提是什么?
会和属性访问相关的魔法方法产生冲突吗?
两者调用的先后顺序是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-23 05:45:43 | 显示全部楼层    本楼为最佳答案   
描述符的调用前提是它需要被定义为另一个类的类属性。

描述符和属性访问相关的魔法方法不会产生冲突,因为它们的调用顺序是有规定的。

它们的调用顺序规定如下:

1. 如果一个类定义了__getattribute__()方法,那么这个方法会在每次属性访问时被调用,无论属性是否存在,无论是否是描述符。

2. 如果__getattribute__()抛出AttributeError异常,那么__getattr__()方法会被调用。

3. 描述符的__get__()和__set__()方法的调用优先级高于实例字典中的数据,也就是说,如果一个类定义了描述符,那么在访问或设置这个描述符的属性时,描述符的方法会被调用。

4. 数据描述符(定义了__get__()和__set__()方法的描述符)的优先级高于非数据描述符(只定义了__get__()方法的描述符),也就是说,如果一个类同时定义了数据描述符和非数据描述符,那么在访问或设置这个描述符的属性时,数据描述符的方法会被调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表