我有一个使用实现虚拟属性的类__getattr__.属性可能很昂贵,例如执行查询.现在,我正在使用一个库,它在实际获取之前检查我的对象是否具有该属性.
因此,查询执行两次而不是一次.当然,实际执行__getattr__以确定属性是否存在是有意义的.
class C(object):
def __getattr__(self, name):
print "I was accessed"
return 'ok'
c = C()
hasattr(c, 'hello')
Run Code Online (Sandbox Code Playgroud)
有什么方法可以防止这种情况吗?
如果支持Python,__hasattr__那么我可以简单地检查查询是否存在,反对实际运行它.
我可以创建一个缓存,但它很重,因为查询可能有参数.当然,服务器可能会缓存查询本身并将问题最小化,但如果查询返回大量数据,它仍然很重要.
有任何想法吗?
我正在测试simpleTAL模板库,它使用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)
Run Code Online (Sandbox Code Playgroud)
将返回True.但是,如果__getattr__引发了AttributeError,系统地没有意义,它将返回False!
有人可以对这个问题有所了解并可能解决方案吗?(我不希望h可以调用).