【问题标题】:Which Python language rule allows the descriptor to be found first?哪个 Python 语言规则允许首先找到描述符?
【发布时间】:2009-12-08 09:52:51
【问题描述】:

昨晚我遇到了以下情况,但我仍然不知道如何解释:

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

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

运行此代码会产生:

2
2

问题是为什么?我对属性访问的理解是在类字典之前检查实例字典,以及任何基的字典,但是如上所示,在类字典中找到描述符之前似乎没有检查实例字典。

【问题讨论】:

    标签: python rules


    【解决方案1】:

    我对属性访问的理解是在类字典之前检查实例字典,任意基的字典

    数据描述符是一个例外:

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

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

    【讨论】:

    • 谢谢!我发誓我之前尝试过文档。 :) 猜猜我什至还没有触及表面的被子下面发生了魔法。
    • @David Wilson:没有魔法。但是,当您尝试将方法函数用作更新 自身 的属性时,您所做的事情就太复杂了。也许如果你对函数和属性使用不同的名称,你会发现没有什么神奇之处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多