如何检查缺失的属性?

00_*_*_00 4 python oop reflection attributes class

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

现在我做

def myclass():
    try:
        self.foo
    except AttributeError:
        self.foo = 'default'
Run Code Online (Sandbox Code Playgroud)

虽然我认为我应该做

if not hasattr(self,'foo'):
    self.foo = 'default'
Run Code Online (Sandbox Code Playgroud)

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

我正在寻找以下标准:

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

Ara*_*Fey 5

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

\n\n

来自文档hasattr

\n\n
\n

hasattr(对象,名称)

\n\n

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

\n
\n\n

文档声明getattr如下

\n\n
\n

getattr(x, \'foobar\')相当于x.foobar

\n
\n\n
\n\n

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

\n\n
hasattr: 0.6325701880014094 seconds\ntry:     0.8206841319988598 seconds\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

最后,这取决于偏好。选择您认为更具可读性的内容。

\n