【问题标题】: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 中都可用。
最后,归结为偏好。选择你觉得更易读的那个。