bio911 发表于 2023-11-14 10:06:39

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

本帖最后由 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)解答从机制上不是很明白。
       我的理解:(费劲拜读了很多遍刘缙老师的解答,太深奥了)如果是数据描述符,则按"类-基类-实例"顺序访问属性;如果是非数据描述符,则按"实例-类-基类"顺序访问属性,对吗?

阿奇_o 发表于 2023-11-15 18:11:47

本帖最后由 阿奇_o 于 2023-11-15 18:13 编辑

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

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

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

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


ps: 真要深究整个过程,可以找找 ionel's codelog: Understanding Python metaclasses 这篇文章,里面有非常细致的流程判断和图
(当然你得有些基础甚至较高水平了,才能看懂。。我反正也没完全看明白。。)

bio911 发表于 2023-11-16 08:37:41

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

感谢大佬答疑,我再消化消化。{:5_109:}
页: [1]
查看完整版本: Python第2版(第179页)例子关于class C问题请教+其他问题请教