如何区分数据属性描述符和非数据属性描述符
来源:8-3 属性描述符和属性查找过程

慕码人5330596
2018-10-30
课程中区分的方式有点模糊
写回答
2回答
-
bobby
2018-11-02
描述符分为数据描述符和非数据描述符。把至少实现了内置属性__set__()和__get__()方法的描述符称为数据描述符;把实现了除__set__()以外的方法的描述符称为非数据描述符。之所以要区分描述符的种类,主要是因为它在代理类属性时有着严格的优先级限制。例如当使用数据描述符时,因为数据描述符大于实例属性,所以当我们实例化一个类并使用该实例属性时,该实例属性已被数据描述符代理,此时我们对该实例属性的操作是对描述符的操作。描述符的优先级的高低如下:
类属性 > 数据描述符 > 实例属性 > 非数据描述符 > 找不到的属性触发__getattr__()
222023-01-03 -
pineryme
2018-10-30
可以这么理解,一个字段类型的数值可以修改,即为数据属性描述符?不可修改非数据属性不可以设置?
也就是这个数据类是否实现了__set__、__get__
设置了 __set__、__get__表示可读可写即为数据属性描述符,设置了__get__但是没有设置__set__,或者__set__里raise AttributeError.
比如int_value = IntField(),这个IntField里面实现了__set__方法即为数据属性描述符。
不知道解答的是否正确。
112018-11-02
相似问题