如何检查缺少的属性?

时间:2018-04-04 14:03:28

标签: python class oop reflection attributes

我必须检查foomyclass的属性。

现在我做

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

虽然我认为我应该这样做

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

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

我正在寻找以下标准:

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

1 个答案:

答案 0 :(得分:2)

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

来自the hasattr docs

  

hasattr(对象,名称)

     

参数是一个对象和一个字符串。如果字符串是对象属性之一的名称,则结果为True,如果为,则为False   不。 (这是通过调用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中都可用。

最后,归结为偏好。选择你认为更具可读性的那些。

相关问题