请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

2回答

bobby 2018-11-02 12:59:14

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

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


2 回复 有任何疑惑可以回复我~
  • 老师,这里的顺序是不是有问题,我感觉类属性是倒数第二的顺序,
    class NonDataIntField:
        # 非数据属性描述符
        def __get__(self, instance, owner):
            # return self.value
            return 3
    
    class User:
        age = 4
        age = NonDataIntField()
    这段代码打印的是3,所以顺序应该是:
    数据描述符 > 实例属性 > 非数据描述符 > 类属性 > 找不到的属性触发__getattr__(),这样才对吧?
    回复 有任何疑惑可以回复我~ 2022-12-29 10:03:25
  • bobby 回复 无限灬 #2
    https://zh.m.wikibooks.org/zh-hans/Python/%E6%8F%8F%E8%BF%B0%E7%AC%A6 可以看看这篇文章
    回复 有任何疑惑可以回复我~ 2023-01-03 00:06:06
pineryme 2018-10-30 22:12:05

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

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

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

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

不知道解答的是否正确。

1 回复 有任何疑惑可以回复我~
  • bobby #1
    正解,
    回复 有任何疑惑可以回复我~ 2018-11-02 12:59:32
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信