协慌网

登录 贡献 社区

如何知道对象在 Python 中是否具有属性

有没有办法在 Python 中确定对象是否具有某些属性?例如:

>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

在使用之前如何判断a是否具有属性property

答案

尝试hasattr()

if hasattr(a, 'property'):
    a.property

编辑:请参阅下面的zweiterlinde 的答案 ,谁提供了关于请求宽恕的好建议!一种非常 pythonic 的方法!

python 中的一般做法是,如果属性可能在大多数时间都存在,只需调用它并让异常传播,或者使用 try / except 块捕获它。这可能会比hasattr更快。如果该属性很可能在大多数时间不存在,或者您不确定,使用hasattr可能会比重复进入异常块更快。

正如Jarret Hardie回答的那样, hasattr将会做到这一点。不过,我想补充一点,Python 社区中的许多人都建议采用 “更容易请求宽恕而不是许可”(EAFP)的策略,而不是 “在你跳跃之前先看”(LBYL)。见这些参考文献:

EAFP 对 LBYL(Re:到目前为止有点失望)
EAFP vs. LBYL @Code 就像一个 Pythonista:惯用语

即:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... 优先:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

你可以使用hasattr()或 catch AttributeError ,但是如果你真的只想要属性的值,如果它不存在,那么最好的选择就是使用getattr()

getattr(a, 'property', 'default value')