以下内容:
class A(object):
def __getattr__(self, attr):
try:
return self.__dict__[attr]
except KeyError:
self.__dict__[attr] = 'Attribute set to string'
print 'Assigned attribute'
return self.__dict__[attr]
返回:
obj = A()
obj.foo
Assigned attribute
Assigned attribute
Assigned attribute
'Attribute set to string'
魔法发生在哪里?
(我在2.6.6)
修改:感谢您的反馈。实际上,这个问题无法从Python命令行本身重现。似乎只有在Eclipse / PyDev中使用控制台时才会出现。
答案 0 :(得分:3)
我的代码版本略有不同,可能有所帮助。
class A(object):
def __getattr__(self, attr):
try:
return self.__dict__[attr]
except KeyError:
self.__dict__[attr] = 'Attribute set to string'
print 'Assigned attribute', attr
return self.__dict__[attr]
>>> o = A()
>>> o.foo
Assigned attribute foo
'Attribute set to string'
我不知道你怎么看多次“分配属性”。这是Python 2.6.6。
值得注意的是,如果调用try
,__getattr__
始终会失败。
答案 1 :(得分:1)
这不会发生:
class A(object):
def __getattr__(self, attr):
try:
return self.__dict__[attr]
except KeyError:
self.__dict__[attr] = 'Attribute set to string'
print 'Assigned attribute'
return self.__dict__[attr]
obj = A()
print obj.foo
给出:
Assigned attribute
Attribute set to string
__getattr__
仅在属性不存在时调用!所以try .. except
每次都会进入除外......
相当于:
class A(object):
def __getattr__(self, attr):
val = 'Attribute set to string'
setattr(self, attr, val)
print 'Assigned attribute'
return val