这是我的代码:
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
)。
为什么呢?
答案 0 :(得分:2)
__getattr__
仅用于缺少属性。请参阅spray-json:
当属性查找未在通常位置找到该属性时调用(即,它不是实例属性,也不在类树中找到自己)。
在您的第一个示例中,'value'
不是缺少的属性;它是在__init__
中设置的。请注意,设置的位置并不重要,只有它存在。
如果您必须拦截所有属性访问权限,则需要实施documentation。