2

我正在测试 simpleTAL 模板库,它使用 callable 来测试传递给模板的对象是否是函数。callable 的定义说,如果一个对象包含魔法方法,它就是可调用的__call__。另请参阅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)

将返回真。但是,如果__getattr__引发 AttributeError,这对系统地执行没有意义,它将返回 False!

有人可以阐明这个问题并可能提供解决方案吗?(我不希望 h 可调用)。

4

1 回答 1

6

您的__getattr__钩子返回所有属性的值:

>>> h.__call__
'blah'

因此对hasattr(h, '__call__')回报进行测试True

>>> hasattr(h, '__call__')
True

确保你提出一个AttributeError对象不支持的属性。

注意:这仅适用旧式实例;新样式类的实例(Python 3 中的默认值,以及从 Python 2 中继承的任何类)的属性object未测试;__call__而是咨询班级本身。

因此,您也可以切换到新型类来缓解这种情况,但您__getattr__仍然不应该太宽泛。

于 2013-09-05T20:16:18.113 回答