关于python描述符的几点澄清

关于python描述符的几点澄清,python,Python,有人能举个例子帮我理解吗 如果实例的字典中有与数据描述符同名的条目,则数据描述符优先。如果实例的字典有一个与非数据描述符同名的条目,则字典条目优先 该实现通过一个优先级链工作,该优先级链将数据描述符的优先级指定给实例变量,实例变量的优先级指定给非数据描述符,并将最低优先级指定给uGetAttr(如果提供) 具体来说,我不明白的是: 一个实例的字典怎么可能有一个与描述符同名的条目。你能给我举个例子吗 另外,你能给我一个例子,其中数据描述符优先于实例变量,实例变量优先于非数据描述符,等等 同样,在下

有人能举个例子帮我理解吗

如果实例的字典中有与数据描述符同名的条目,则数据描述符优先。如果实例的字典有一个与非数据描述符同名的条目,则字典条目优先

该实现通过一个优先级链工作,该优先级链将数据描述符的优先级指定给实例变量,实例变量的优先级指定给非数据描述符,并将最低优先级指定给uGetAttr(如果提供)

具体来说,我不明白的是:

  • 一个实例的字典怎么可能有一个与描述符同名的条目。你能给我举个例子吗

  • 另外,你能给我一个例子,其中数据描述符优先于实例变量,实例变量优先于非数据描述符,等等

  • 同样,在下面的代码中,我惊讶地看到testclass中的self.x调用了_uu_;集__;: 我相信这种行为是因为上面链接中有这样的解释:

    对于对象,机器位于object.\uuuuuuuGetAttribute\uuuuuux()中,它将b.x转换为类型(b)。\uuuuu口述获取(b,类型(b))。对吧

        #! /usr/bin/env python
        class descclass(object):
    
                def __init__(self, value):
                        print "in desc init"
                        self.value = value
                        print "out of desc init"                
    
                def __get__(self, inst, insttype):
                        print "in desc get"
                        return self.value
    
                def __set__(self,inst, val):
                        print "in desc set"
                        self.value = val
    
        class testclass(object):
    
                x = descclass(100)
                print "desc created"
    
                def __init__(self, val):
                        print "in testclass init"
                        self.x = val  # this invokes __set__ on descriptor in x
                        print "out of testclass init"
    
        if __name__ == '__main__':
    
                t = testclass(45)
                print t.x
                print vars(t)
                print vars(testclass)
    
    这里有一个例子

    # Not a data descriptor because it doesn't define __set__
    class NonDataDescriptor(object):
        def __get__(self, obj, objtype):
            return 3
    
    class Namespace(object):
    
        # Data descriptor - defines both __get__ and __set__
        @property
        def foo(self):
            return 3
    
        bar = NonDataDescriptor()
    
    x = Namespace()
    x.__dict__['foo'] = 4  # We bypass the foo descriptor's __set__ here,
    x.bar = 4              # but there's no bar setter, so this one goes to the dict
    
    # x now has foo and bar descriptors and __dict__ entries
    
    print x.foo  # prints 3 - data descriptor wins over instance __dict__ entry
    print x.bar  # prints 4 - instance __dict__ entry wins over non-data descriptor
    
    这里有一个例子

    # Not a data descriptor because it doesn't define __set__
    class NonDataDescriptor(object):
        def __get__(self, obj, objtype):
            return 3
    
    class Namespace(object):
    
        # Data descriptor - defines both __get__ and __set__
        @property
        def foo(self):
            return 3
    
        bar = NonDataDescriptor()
    
    x = Namespace()
    x.__dict__['foo'] = 4  # We bypass the foo descriptor's __set__ here,
    x.bar = 4              # but there's no bar setter, so this one goes to the dict
    
    # x now has foo and bar descriptors and __dict__ entries
    
    print x.foo  # prints 3 - data descriptor wins over instance __dict__ entry
    print x.bar  # prints 4 - instance __dict__ entry wins over non-data descriptor
    

    描述符总是类的一部分;实例有自己的属性,通常它们优先于类上的任何属性

    数据描述符只是具有
    \uuuu get\uuuu
    \uuu set\uuu
    方法的描述符。Python就是这样做的:

  • 查看是否有数据描述符;具有两个钩子的描述符
  • 在实例上查找属性
  • 在类上查找常规(非数据)描述符
  • 返回到类上的常规属性

  • 第3点。四,。其实是一回事;描述符是具有特定方法的类属性;因此,当属性上没有描述符挂钩时,第4点实际上就是第3点。

    描述符总是类的一部分;实例有自己的属性,通常它们优先于类上的任何属性

    数据描述符只是具有
    \uuuu get\uuuu
    \uuu set\uuu
    方法的描述符。Python就是这样做的:

  • 查看是否有数据描述符;具有两个钩子的描述符
  • 在实例上查找属性
  • 在类上查找常规(非数据)描述符
  • 返回到类上的常规属性

  • 第3点。四,。其实是一回事;描述符是具有特定方法的类属性;因此,当属性上没有描述符挂钩时,第4点实际上就是第3点。

    请修改第3点,将其称为非数据描述符。这不是更有意义吗?在上面的文档中,实例变量实际上意味着实例属性。对吗?请修改#3以表示非数据描述符。这不是更有意义吗?在上面的文档中,实例变量实际上意味着实例属性..对吗?那么在上面的文档中,实例变量实际上意味着实例属性..对吗?@abc:它指的是实例的
    \uu dict\uu
    中的条目。我不相信这是标准或明确的术语;可能措辞会更好。谢谢你的澄清。接受这一点是因为您给出了示例代码。你也可以得到一个更好的stackoverflow句柄。我可以,但是当我看到我的自动生成句柄非常接近初始素数序列时,我无法改变它。完全不明显。但是什么是素数的初始序列呢?所以在上面的文档中,实例变量实际上意味着实例属性..对吗?@abc:它指的是实例的
    \uuuu dict\uuu
    中的条目。我不相信这是标准或明确的术语;可能措辞会更好。谢谢你的澄清。接受这一点是因为您给出了示例代码。你也可以得到一个更好的stackoverflow句柄。我可以,但是当我看到我的自动生成句柄非常接近初始素数序列时,我无法改变它。完全不明显。但什么是素数的初始序列呢?