加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在hasattr()上没有eval的Python延迟属性

发布时间:2020-12-17 00:51:13 所属栏目:Python 来源:网络整理
导读:当你尝试使用hasattr()访问它时,是否有可能使一个装饰器使属性变得懒惰而不是eval?我弄清楚如何让它变得懒惰,但是hasattr()会让它过早地进行评估.例如., class lazyattribute: # Magic.class A: @lazyattribute def bar(self): print("Computing") return 5

当你尝试使用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__))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读