如何区分数据属性描述符和非数据属性描述符

来源:8-3 属性描述符和属性查找过程

慕码人5330596

2018-10-30

课程中区分的方式有点模糊

写回答

2回答

bobby

2018-11-02

描述符分为数据描述符和非数据描述符。把至少实现了内置属性__set__()和__get__()方法的描述符称为数据描述符;把实现了除__set__()以外的方法的描述符称为非数据描述符。之所以要区分描述符的种类,主要是因为它在代理类属性时有着严格的优先级限制。例如当使用数据描述符时,因为数据描述符大于实例属性,所以当我们实例化一个类并使用该实例属性时,该实例属性已被数据描述符代理,此时我们对该实例属性的操作是对描述符的操作。描述符的优先级的高低如下:

  类属性 > 数据描述符 > 实例属性 > 非数据描述符 > 找不到的属性触发__getattr__()


2
2
bobby
回复
无限灬
https://zh.m.wikibooks.org/zh-hans/Python/%E6%8F%8F%E8%BF%B0%E7%AC%A6 可以看看这篇文章
2023-01-03
共2条回复

pineryme

2018-10-30

可以这么理解,一个字段类型的数值可以修改,即为数据属性描述符?不可修改非数据属性不可以设置?

也就是这个数据类是否实现了__set__、__get__

设置了 __set__、__get__表示可读可写即为数据属性描述符,设置了__get__但是没有设置__set__,或者__set__里raise AttributeError.

比如int_value = IntField(),这个IntField里面实现了__set__方法即为数据属性描述符。

不知道解答的是否正确。

1
1
bobby
正解,
2018-11-02
共1条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2127 学习 · 551 问题

查看课程