How to prevent hasattr from retrieving the attribute value itself
I have a class that implements virtual attributes using __getattr__
. The attributes can be expensive, eg performing a query. Now, I am using a library which checks if my object has the attribute before actually getting it.
As a consequence, a query is executed two times instead of one. Of course it makes sense to actually execute __getattr__
to really know if the attribute exists.
class C(object):
def __getattr__(self, name):
print "I was accessed"
return 'ok'
c = C()
hasattr(c, 'hello')
Is there any way to prevent this?
If Python supported __hasattr__
then I could simply check if the query exists, has opposed to actually run it.
I can create a cache, but it is heavy since a query might have parameters. Of course, the server might cache the queries itself and minimise the problem, but it is still heavy if queries return a lot of data.
Any ideas?
Although initially I was not fond of the idea of monkey patching, being a "bad idea" in general, I came across a very neat solution from 1999!!
http://code.activestate.com/lists/python-list/14972/
def hasattr(o, a, orig_hasattr=hasattr):
if orig_hasattr(o, "__hasattr__"):
return o.__hasattr__(a)
return orig_hasattr(o, a)
__builtins__.hasattr = hasattr
Essentially it creates support for __hasattr__
in Python, which is what I thought originally would be the optimal solution.
我认为这通常可能是一种不好的模式,但您可以随时检查对象的底层__dict__
。
In [1]: class A(object):
....: @property
....: def wha(self):
....: print "was accessed"
....:
In [2]: A.__dict__
Out[2]:
<dictproxy {'__dict__': <attribute '__dict__' of 'A' objects>,
'__doc__': None,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'A' objects>,
'wha': <property at 0x10f6b11b0>}>
In [3]: a = A()
In [4]: "wha" in a.__class__.__dict__
Out[4]: True
链接地址: http://www.djcxy.com/p/26336.html
上一篇: 保持角度控制器很薄
下一篇: 如何防止hasattr检索属性值本身