我正在测试 simpleTAL 模板库,它使用 callable 来测试传入模板的对象是否为函数。 callable 的定义是说如果一个对象包含魔法方法__call__
,那么它就是可调用的。另见 What is a "callable" in Python? .
但是,使用以下类定义创建的对象(python 2.7.4)
class H:
def __init__(self, val):
self.a = val
def __getattr__(self, name):
return 'blah'
h = H(1)
callable(h)
将返回 True。但是,如果 __getattr__
引发 AttributeError,系统地这样做没有意义,它将返回 False!
有人可以阐明这个问题并可能提供解决方案吗? (我不希望 h 是可调用的)。
最佳答案
您的 __getattr__
Hook 返回所有 属性的值:
>>> h.__call__
'blah'
因此 hasattr(h, '__call__')
的测试返回 True
:
>>> hasattr(h, '__call__')
True
确保为对象不支持的属性引发 AttributeError
。
注意:这仅适用于旧式实例;新式类的实例(Python 3 中的默认类,以及 Python 2 中任何继承自 object
的类)的实例未针对 __call__
属性进行测试;相反,类本身被咨询。
因此,您也可以切换到新型类来缓解这种情况,但您的 __getattr__
仍然不应太宽泛。
关于python - 可调用问题,检测到的不仅仅是 __call__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18645111/