try:
spam.foo
except AttributeError:
do_somthing()
(不使用它来检查这样的属性是明智的吗?)
答案 0 :(得分:13)
<强>更新强>:
如果您真的只关心属性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()
我链接的Wikipedia部分描述了这一点。引用(其中 EAFP版本指的是您编写代码示例的方式):
这两个代码示例具有相同的效果,但会有性能差异。当垃圾邮件具有属性鸡蛋时, EAFP 样本运行得更快。当垃圾邮件没有属性 egg(“例外”情况)时,EAFP示例运行速度。 (...)如果特殊情况很少,那么 EAFP版将具有优越的平均性能。
在某种程度上显而易见的是(使用EAFP),您不必在每次想要访问属性之前都内省对象。
答案 1 :(得分:2)
更好地使用
if hasattr(spam,"foo"):
#dosomthing with spam.foo
else:
do_somthing()
Python文档:
hasattr(对象,名称)
参数是一个对象和一个字符串。如果是,则结果为True string是其中一个的名称 对象的属性,否则为False。 (这是通过调用来实现的 getattr(对象,名称)和看到 是否引发例外或 不。)