2009-12-08 91 views
2

我撞到下面昨晚,我仍处于亏损状态,以解释:哪种Python语言规则允许首先找到描述符?

class Foo(object): 
    @property 
    def dave(self): 
     vars(self)['dave'] = 1 
     return 2 

f = Foo() 
print f.dave 
print f.dave 

运行该代码产生:

2 
2 

问题是为什么?我对属性访问的理解是在类字典之前检查实例字典,并且在类字典中找到描述符之前,在实例字典上方看到的任何基本字典都没有被检查。

回答

5

我的访问属性的理解是,该实例字典类字典前检查,和任何基地

数据描述符的字典是一个例外:

例如绑定,描述符调用的优先级取决于哪些描述符方法被定义。通常,数据描述符定义了__get__()__set__(),而非数据描述符只有__get__()方法。数据描述符总是覆盖实例字典中的重定义。相反,非数据描述符可以被实例覆盖。

http://docs.python.org/reference/datamodel.html#invoking-descriptors

+0

谢谢!我发誓我早些时候尝试过文档。 :)猜猜这些封面下面有什么神奇的东西,我甚至没有抓到它的表面。 – dmw 2009-12-08 10:27:15

+0

@大卫威尔逊:没有魔法。但是当你试图让一个方法函数作为一个更新*本身的属性时*你做的事情太复杂了。也许如果你对函数和属性使用了不同的名字,你会发现没有魔法。 – 2009-12-08 11:32:31