小编kor*_*der的帖子

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

我有一个使用实现虚拟属性的类__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__那么我可以简单地检查查询是否存在,反对实际运行它.

我可以创建一个缓存,但它很重,因为查询可能有参数.当然,服务器可能会缓存查询本身并将问题最小化,但如果查询返回大量数据,它仍然很重要.

有任何想法吗?

python hasattr getattr

7
推荐指数
2
解决办法
1012
查看次数

可调问题,检测超过__call__

我正在测试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可以调用).

python

2
推荐指数
1
解决办法
71
查看次数

标签 统计

python ×2

getattr ×1

hasattr ×1