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)
这两种方法之间有什么区别吗?应该首选哪一种?
我正在寻找以下标准:
这两种方法在功能上是等效的。
\n\n\n\n\n\n\n\n\nhasattr(对象,名称)
\n\n参数是一个对象和一个字符串。如果字符串是对象\xe2\x80\x99s 属性之一的名称,则结果为 True,否则为 False。(这是通过调用 getattr(object, name) 并查看它是否引发 AttributeError 来实现的。)
\n
\n\n\n\n
getattr(x, \'foobar\')
相当于x.foobar
关于速度,我的测试表明速度hasattr
要快一些。100万次迭代的结果是:
hasattr: 0.6325701880014094 seconds\ntry: 0.8206841319988598 seconds\n
Run Code Online (Sandbox Code Playgroud)\n\n除非您正在编写高度优化的代码,否则无需担心如此小的差异。也无需担心与 python 版本的兼容性;属性访问 并hasattr
在每个版本的 python 中都可用。
最后,这取决于偏好。选择您认为更具可读性的内容。
\n