作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试 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/
我是一名优秀的程序员,十分优秀!