当你尝试使用hasattr()访问它时,是否有可能使一个装饰器使属性变得懒惰而不是eval?我弄清楚如何让它变得懒惰,但是hasattr()会让它过早地进行评估.例如.,
class lazyattribute:
# Magic.
class A:
@lazyattribute
def bar(self):
print("Computing")
return 5
>>> a = A()
>>> print(a.bar)
'Computing'
5
>>> print(a.bar)
5
>>> b = A()
>>> hasattr(b,'bar')
'Computing'
5
# Wanted output: 5
最佳答案
这可能很难.从hasattr documentation:
hasattr(对象,名称)
参数是一个对象和一个字符串.如果字符串是对象属性之一的名称,则结果为True,否则返回False. (这是通过调用getattr(object,name)并查看它是否引发异常来实现的.)
由于属性可以通过__getattr__方法动态生成,因此没有其他方法可靠地检查它们的存在.对于您的特殊情况,也许明确地测试字典就足够了:
any('bar' in d for d in (b.__dict__,b.__class__.__dict__))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。