7

我不明白以下优先级在__getattribute__()特殊方法的上下文中意味着什么和Descriptors

我在Core Python Programmingtopic("Precedence") - under topic ("Desriptors") 3次的书下读了这个,仍然无法通过它。任何人都可以解释这些优先级是什么,以及它们的用途是什么?

  • 类属性
  • 数据描述符
  • 实例属性
  • 非数据描述符
  • 默认为__getattr__()

我还阅读了python 文档,在其中找到了以下语句:-

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

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

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

任何人都可以举一个小例子来解释这first paragraph是什么意思吗?还有说 - 是什么意思override a redefinition in an instance dictionary

4

1 回答 1

4

假设你有一个类:

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

让我们首先看一下数据描述符。如果在你的代码中你这样做:

cobj = C()
cobj.dd

根据上面的段落,当访问属性时,cobj.__dict__对象总是会被覆盖,即描述符对象的方法总是被使用而不是字典。唯一的例外发生在描述符对象未定义方法时。然后,如果对象中有键,则将读取其值,否则将返回描述符对象本身。dd__get__/__set__/__del____get__ddcobj.__dict__

现在是非数据描述符。如果在您的代码中调用:

cobj.ndd = 2

然后cobj.__dict__ 隐藏非数据描述符,并且ndd始终从cobj.__dict__对象中读取属性。所以如果你这样做:

cobj.ndd

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

del cobj.ndd

然后描述符又回来了,所以调用

cobj.ndd

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

于 2012-09-27T12:15:16.390 回答