运行此代码时没有打印任何内容。为什么?没有异常被抛出,if ... elif ... else结构中没有任何内容被执行。
环境:Python 2.7。
d= {"x":1}
class bizarre(object):
def __init__(self):
self.metadata = {}
def __getattr__(self, name):
return self.metadata.get(name, None)
@property
def odd(self):
if False:
print '1'
elif self.fake.get("blah", ''):
print '2'
else:
print '3'
b=bizarre()
b.odd
The previous answer建议的BrenBarn提供了回答我的问题所需的信息,但不是直接的。但我现在可以回答我自己的问题:
属性装饰器使用AttributeError
作为来自getter的信号来调用__getattr__
,因此如果你的getter抛出属性错误,它将被捕获并且你不会看到它。< / p>
感谢lemonhead和mission.liao放纵我的无知。
答案 0 :(得分:4)
好的,我弄清楚这里发生了什么:
elif self.fake.get("blah", ''):
print '2'
这是有问题的路线。 self.fake
为None
,因此正在运行None.get('blah')
会引发AttributeError
。但是,由于这是在一个属性中,python将其视为该属性不存在,因此依次调用__getattr__
,它不会打印任何内容
答案 1 :(得分:1)
主要原因是你覆盖__getattr__方法
当你删除奇怪的.__ getattr __时,会按预期调用bizarre.odd。