描述符:通过属性访问的优先级
我无法理解下面的优先级在__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__
方法。