描述符:通过属性访问的优先级

我无法理解下面的优先级在__getattribute__()特殊方法和Descriptors情况下意味着什么

我在topic("Precedence") - under topic ("Desriptors")核心Python编程topic("Precedence") - under topic ("Desriptors")一书的topic("Precedence") - under topic ("Desriptors")topic("Precedence") - under topic ("Desriptors")阅读了这个topic("Precedence") - under topic ("Desriptors") 3次)​​,仍然无法通过它。任何人都可以解释这些优先级以及它们的使用位置对于??

  • 类属性
  • 数据描述符
  • 实例属性
  • 非数据描述符
  • 默认为__getattr__()
  • 我也读了python文档,在那里我找到了下面的声明:

    对于实例绑定,描述符调用的优先级取决于哪个描述符方法被定义。 描述符可以定义__get__()__set__()__delete__()任意组合。 如果它没有定义__get__() ,那么访问该属性将返回描述符对象本身,除非对象的实例字典中有值。 如果描述符定义__set__()和/或__delete__() ,则它是一个数据描述符; 如果它既不定义,它也是一个非数据描述符。 通常,数据描述符定义__get__()__set__() ,而非数据描述符只有__get__()方法。

    使用**__set__()****__get__()**定义的数据描述符总是覆盖实例字典中的重定义。 相反,非数据描述符可以被实例覆盖。

    Python方法(包括staticmethod()classmethod() )被实现为非数据描述符。 因此,实例可以重新定义和覆盖方法。 这允许各个实例获取与同一类的其他实例不同的行为。

    任何人都可以举一个小例子来解释first paragraph的内容吗? 此外,它是什么意思 - override a redefinition in an instance dictionary


    假设你有一个类:

    class C(object):
        dd = MyDataDescriptor()
        ndd = MyNonDataDescriptor()
        def __init__(self):
            self.__value = 1
    

    我们首先看数据描述符。 如果在你的代码中你做到了:

    cobj = C()
    cobj.dd
    

    相应于上述段落中, cobj.__dict__对象将当总是重写dd属性被访问时,即__get__/__set__/__del__描述符对象的方法将总是被用来代替字典。 唯一的异常发生在描述符对象未定义__get__方法时。 那么如果在cobj.__dict__对象中有一个dd键,它的值将被读取,如果不是,描述符对象本身将被返回。

    现在用于非数据描述符。 如果在你的代码中你打电话:

    cobj.ndd = 2
    

    那么cobj.__dict__隐藏了非数据描述符,并且ndd属性总是从cobj.__dict__对象中读取。 所以如果你这样做:

    cobj.ndd
    

    描述符的__get__方法将不会被调用。 但是,如果从字典中删除属性:

    del cobj.ndd
    

    那么描述符回来了,所以调用

    cobj.ndd
    

    将在描述符上调用__get__方法。

    链接地址: http://www.djcxy.com/p/64235.html

    上一篇: Descriptors : Precendence of Attribute access through

    下一篇: How do i separate JavaScript View/Logic code properly