try:
spam.foo
except AttributeError:
do_somthing()
Run Code Online (Sandbox Code Playgroud)
(在不使用它的情况下检查这样的属性是明智的吗?)
Fel*_*ing 13
更新:
如果您真的只对该属性是否foo存在感兴趣(并且不对该属性执行某些操作),那么当然hasattr()可能是检查该属性的更好方法.
从开发者/用户的角度来看,我必须承认,对我来说,hasattr()更好的使用反映了你的意图.除此之外,它会导致更少的代码:
if not hasattr(spam,'foo'):
do_something()
Run Code Online (Sandbox Code Playgroud)
文档hasattr()描述了它是通过以下方式实现的:
(这是通过实现)调用
getattr(object, name)并查看它是否引发异常.
所以基本上hasattr()和你做的完全一样.在这种情况下,我肯定会采用构建解决方案,即hasattr().你不会获得任何速度优势.
Python鼓励EAFP范例:
要求宽恕比获得更容易
所以,如果你或多或少知道大多数时候spam都会有一个foo属性(代码会更快(很少?)),这就是应该这样做的方式.
否则,如果spam没有foo属性(大部分时间),那么这种方法会更好:
if hasattr(spam, 'foo'):
bar = spam.foo
else:
do_somthing()
Run Code Online (Sandbox Code Playgroud)
我链接的维基百科上的部分描述了这一点.引用(EAFP版本指代您编写代码示例的方式):
这两个代码示例具有相同的效果,但会有性能差异.当垃圾邮件具有属性 egg时,EAFP样本将运行得更快.当垃圾邮件没有属性 egg("例外"情况)时,EAFP样本将运行得更慢.(...)如果特殊情况很少见,那么EAFP版本的平均性能将优于其他情况.
这在某种程度上是显而易见的(使用EAFP)您不必在每次想要访问属性之前内省对象.