如何防止hasattr检索属性值本身

我有一个使用__getattr__实现虚拟属性的类。 属性可能很昂贵,例如执行查询。 现在,我正在使用一个库,在实际获取它之前检查我的对象是否具有该属性。

因此,查询被执行两次而不是一次。 当然,实际执行__getattr__才能真正知道该属性是否存在。

class C(object):
    def __getattr__(self, name):
        print "I was accessed"
        return 'ok'

c = C()
hasattr(c, 'hello')

有什么办法可以防止这种情况发生?

如果Python支持__hasattr__那么我可以简单地检查查询是否存在,反对实际运行它。

我可以创建一个缓存,但由于查询可能有参数,因此它很重。 当然,服务器可能会自己缓存查询并最大限度地减少问题,但如果查询返回大量数据,它仍然很重。

有任何想法吗?


虽然最初我不喜欢猴子补丁的想法,但总的来说,这是一个“坏主意”,但我从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

本质上它创建了对Python中__hasattr__支持,这正是我认为最初的解决方案。


我认为这通常可能是一种不好的模式,但您可以随时检查对象的底层__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/26335.html

上一篇: How to prevent hasattr from retrieving the attribute value itself

下一篇: How to call a stored procedure and get return value in Slick (using Scala)