首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止hasattr检索属性值本身

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

Stack Overflow用户
提问于 2015-05-18 02:15:35
回答 2查看 1.8K关注 0票数 7

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

因此,查询将执行两次而不是一次。当然,实际执行__getattr__来真正知道属性是否存在是有意义的。

代码语言:javascript
复制
class C(object):
    def __getattr__(self, name):
        print "I was accessed"
        return 'ok'

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

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

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

我可以创建一个缓存,但它很重,因为查询可能有参数。当然,服务器可能会自己缓存查询并将问题降到最低,但如果查询返回大量数据,它仍然很繁重。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-20 20:28:57

虽然一开始我不喜欢猴子补丁的想法,但总的来说,这是一个“坏主意”,我从1999年就想到了一个非常好的解决方案!!

http://code.activestate.com/lists/python-list/14972/

代码语言:javascript
复制
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__的支持,这是我最初认为的最佳解决方案。

票数 5
EN

Stack Overflow用户

发布于 2015-05-18 02:22:39

我认为这可能是一个糟糕的模式,但您可以随时检查对象的底层__dict__

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30290389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档