采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
课程中区分的方式有点模糊
描述符分为数据描述符和非数据描述符。把至少实现了内置属性__set__()和__get__()方法的描述符称为数据描述符;把实现了除__set__()以外的方法的描述符称为非数据描述符。之所以要区分描述符的种类,主要是因为它在代理类属性时有着严格的优先级限制。例如当使用数据描述符时,因为数据描述符大于实例属性,所以当我们实例化一个类并使用该实例属性时,该实例属性已被数据描述符代理,此时我们对该实例属性的操作是对描述符的操作。描述符的优先级的高低如下:
类属性 > 数据描述符 > 实例属性 > 非数据描述符 > 找不到的属性触发__getattr__()
老师,这里的顺序是不是有问题,我感觉类属性是倒数第二的顺序, class NonDataIntField: # 非数据属性描述符 def __get__(self, instance, owner): # return self.value return 3 class User: age = 4 age = NonDataIntField() 这段代码打印的是3,所以顺序应该是: 数据描述符 > 实例属性 > 非数据描述符 > 类属性 > 找不到的属性触发__getattr__(),这样才对吧?
https://zh.m.wikibooks.org/zh-hans/Python/%E6%8F%8F%E8%BF%B0%E7%AC%A6 可以看看这篇文章
可以这么理解,一个字段类型的数值可以修改,即为数据属性描述符?不可修改非数据属性不可以设置?
也就是这个数据类是否实现了__set__、__get__
设置了 __set__、__get__表示可读可写即为数据属性描述符,设置了__get__但是没有设置__set__,或者__set__里raise AttributeError.
比如int_value = IntField(),这个IntField里面实现了__set__方法即为数据属性描述符。
不知道解答的是否正确。
正解,
登录后可查看更多问答,登录/注册
socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO
1.2k 31
1.1k 24
1.1k 16
1.4k 10
1.1k 9