【问题标题】:how to check for a missing attribute?如何检查缺少的属性?
【发布时间】:2018-09-14 03:20:59
【问题描述】:

我必须检查foo 是否是myclass 的属性。

现在可以

def myclass():
    try:
        self.foo
    except AttributeError:
        self.foo = 'default'

虽然我认为我应该这样做

if not hasattr(self,'foo'):
    self.foo = 'default'

这两种方法有什么区别,应该首选哪一种?

我正在寻找以下标准:

  • 与多重继承的一致性
  • 跨 python 版本的可移植性
  • 开销有限

【问题讨论】:

    标签: python class oop reflection attributes


    【解决方案1】:

    这两种方法在功能上是等效的。

    来自the hasattr docs:

    hasattr(对象,名称)

    参数是一个对象和一个字符串。如果字符串是对象属性之一的名称,则结果为 True,如果 不是。 (这是通过调用 getattr(object, name) 并查看 是否引发 AttributeError。)

    the getattr docs 声明如下:

    getattr(x, 'foobar') 等价于x.foobar


    关于速度,我的测试表明hasattr 快一点。 100 万次迭代的结果是:

    hasattr: 0.6325701880014094 seconds
    try:     0.8206841319988598 seconds
    

    除非您正在编写高度优化的代码,否则无需担心这么小的差异。也无需担心与 python 版本的兼容性;属性访问和hasattr 在每个版本的python 中都可用。


    最后,归结为偏好。选择你觉得更易读的那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 2021-02-23
      • 2020-01-08
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多