我正在测试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可以调用。)
答案 0 :(得分:6)
您的__getattr__
挂钩会返回所有属性的值:
>>> h.__call__
'blah'
因此hasattr(h, '__call__')
的测试会返回True
:
>>> hasattr(h, '__call__')
True
确保为对象不支持的属性引发AttributeError
。
注意:这仅将 应用于旧式实例;新样式的实例(Python 3中的默认值,以及Python 2中从object
继承的任何类)未针对__call__
属性进行测试;相反,我们会咨询班级本身。
因此,您可以切换到新式课程以缓解此问题,但您的__getattr__
仍然不应过于宽泛。