【发布时间】:2015-07-17 07:01:12
【问题描述】:
好的,我遇到了一点问题,我不太确定为什么会这样。我想要做的是允许通过 python 2.7.XI 中的 snake_case 或 camelCase 访问对象上的属性认为__getattr__ 是这样做的正确方法,但显然我错了,我不是 ex
这是我的简化实现。在这种情况下,无论您访问什么属性,我都希望返回 foo.x。
class Foo(object):
def __init__(self, x):
self.x = x
def __getattr__(self, name):
if hasattr(self, name):
return getattr(self, name)
elif hasattr(self, 'x'):
return getattr(self, 'x')
else:
raise AttributeError, n
现在如果我这样做:
f = Foo('myX')
f.x
# => "myX"
但是,我不明白为什么:
f.y
永远循环。有趣的是,当我将print "__getattr__ called with : %s" % name 放在__getattr__ 的第一行时,似乎当f.y 被调用时,getattr(self, 'x') 行确实被调用了,但是看起来 getattr 并没有真正被调用用“x”调用,__getattr__ 仍然说它被用“y”调用。
我一直在环顾四周,我认为这与我对getattr 工作原理的误解有关。你们都必须向我指出的任何建议或文件都会非常有益。提前致谢。
【问题讨论】:
-
getattr(self, 'x')完全等同于self.x- 它不会直接进入默认属性查找机制或做任何与self.x不同的事情。你可能误解了hasattr和getattr的作用。
标签: python python-2.7 infinite getattr