Does__getattr__允许修改传递的值吗?

时间:2017-07-31 09:09:52

标签: python attributes operator-overloading getattr getattribute

这是我的代码:

class myclass:
    def __init__(self):
        self.value = 5

    def __getattr__(self, attrname):
        if attrname == 'value':
            return 10

X = myclass()
print X.value

我认为输出值应为10__getattr__修改返回值)。但输出为5

如果我删除了值的初始化:

class myclass:

    def __getattr__(self, attrname):
        if attrname == 'value':
            return 10

X = myclass()
print X.value

按预期工作(返回10)。 为什么呢?

1 个答案:

答案 0 :(得分:2)

__getattr__仅用于缺少属性。请参阅spray-json

  

当属性查找未在通常位置找到该属性时调用(即,它不是实例属性,也不在类树中找到自己)。

在您的第一个示例中,'value'不是缺少的属性;它是在__init__中设置的。请注意,设置的位置并不重要,只有它存在。

如果您必须拦截所有属性访问权限,则需要实施documentation