我必须检查foo
是myclass
的属性。
现在我做
def myclass():
try:
self.foo
except AttributeError:
self.foo = 'default'
虽然我认为我应该这样做
if not hasattr(self,'foo'):
self.foo = 'default'
这两种方法之间有什么区别,哪种方法应该首选?
我正在寻找以下标准:
答案 0 :(得分:2)
这两种方法在功能上都是等效的。
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中都可用。
最后,归结为偏好。选择你认为更具可读性的那些。