try:
    spam.foo
except AttributeError:
    do_somthing()

(在不使用它的情况下检查这样的属性是否明智?)

最佳答案

更新:
如果你真正感兴趣的是属性foo是否存在(而不使用属性),当然比hasattr()更适合检查属性。
从开发人员/用户的角度来看,我不得不承认,对我来说,hasattr()的使用更好地反映了您的意图。除此之外,它将导致更少的代码:

if not hasattr(spam,'foo'):
    do_something()

hasattr()的文档描述了它的实现方式:
(这是通过)调用getattr(object, name)并查看它是否引发异常来实现的。
所以基本上hasattr()和你做的一样。在这种情况下,我肯定会使用内置解决方案,即hasattr()。你不会获得任何速度优势。
Python鼓励EAFP paradigm
请求宽恕比允许容易
所以,如果您或多或少地知道spam在大多数情况下都有一个foo属性,那么这正是您应该这样做的方式(代码将是(很少?)更快)。
否则,如果spam没有foo属性(大多数情况下),则此方法更好:
if hasattr(spam, 'foo'):
    bar = spam.foo
else:
    do_somthing()

我链接到的维基百科部分描述了这一点。引号(其中EAFP版本指的是您编写代码示例的方式):
这两个代码示例具有相同的效果,但会有性能差异。当spam具有eggs属性时,EAFP示例将运行得更快。当spam没有eggs属性时(“异常”情况),EAFP示例将运行得更慢。(…)如果异常情况很少,那么EAFP版本的平均性能将优于其他版本。
这在某种程度上是显而易见的,因为(使用EAFP)您不必每次在访问属性之前都对对象进行内省。

10-08 02:40