鱼C论坛

 找回密码
 立即注册
查看: 1387|回复: 2

Python第2版(第179页)例子关于class C问题请教+其他问题请教

[复制链接]
发表于 2023-11-14 10:06:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 bio911 于 2023-11-13 14:52 编辑

再次向论坛各位大神请教:

一、例子中自定义一个属于我们自己的MyProperty,其中class C这个类定义中,定义了getX,setX,和delX这三个方法
       问题1:定义属于我们自己的MyProperty,这个那么class C中这个x = MyProperty(getX,setX,delX)的 MyProperty到底是描述符还是函数呢?
      
       问题2:class C定义getX,setX,和delX这三个方法的目的是什么?不是要定义一个属于自己的Property吗?不应该在描述符MyProperty中去定义吗?
                (参照知乎例子-如何理解 Python 的 Descriptor? - 刘志军的回答 - 知乎
                   代码行
                  (三w.zhihu.com/question/25391709/answer/30634637)
      
       问题3:这三个方法是否应该拿到描述符MyProperty中去定义呢,如果自定义的MyProperty(类似BIF中Property函数)要实现装饰器功能的话?
      

二、学习中,看到不少人强调/提到属性访问的顺序:
       1、调用_ _getattribute_ _
       2、调用数据描述符
       3、调用当前对象的属性
       4、调用类的所属成员
       5、调用非数据描述符
       6、调用父类的属性
       7、调用_ _getattr_ _
       请问上述的这个优先级顺序,记住这个顺序的目的是什么?

三、如何理解 Python 的 Descriptor? - 刘缙的回答 - 知乎(三w.zhihu.com/question/25391709/answer/30634637)解答从机制上不是很明白。
       我的理解:(费劲拜读了很多遍刘缙老师的解答,太深奥了)如果是数据描述符,则按"类-基类-实例"顺序访问属性;如果是非数据描述符,则按"实例-类-基类"顺序访问属性,对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-15 18:11:47 | 显示全部楼层
本帖最后由 阿奇_o 于 2023-11-15 18:13 编辑

一个关键词、关键句: 其实 就是 一种 类属性 读取时采取的 特定机制(顺序、协议),官方叫做 描述符协议 Descriptor Protocol ?  (名可名非常名,不重要)

或者 简单地说,其 本质是 类属性访问控制

就实际应用而言,只需要记得这样一个比喻:

你和张三约定,你把某件东西(类属性)给他来保管(张三即描述符,你和他之间的约定,就叫"描述符协议")。
当你要用到这件东西时(.调用),张三就根据你们之间定好的约定(相当于__get__所定义的规则),来获取和返回给你那个东西(或关于/基于这个东西的 一个统计/计算结果)。
__set__也是类似的道理。


ps: 真要深究整个过程,可以找找 ionel's codelog: Understanding Python metaclasses 这篇文章,里面有非常细致的流程判断和图
(当然你得有些基础甚至较高水平了,才能看懂。。我反正也没完全看明白。。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-16 08:37:41 | 显示全部楼层
阿奇_o 发表于 2023-11-15 18:11
一个关键词、关键句: 其实 就是 一种 类属性 读取时采取的 特定机制(顺序、协议),官方叫做 描述符协议  ...

感谢大佬答疑,我再消化消化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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