如何知道一个对象是否在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的答案 ,谁提供请求宽恕的好build议! 非常pythonic方法!

python的一般做法是,如果属性可能在大多数情况下存在,只需调用它,或者让exception传播,或者使用try / except块来捕获exception。 这可能会比hasattr更快。 如果该属性很可能不在那里,或者你不确定,那么使用hasattr可能会比反复进入exception块更快。

正如杰瑞特·哈迪(Jarret Hardie)所回答的那样, 不过,我想补充一点,Python社区中的许多人推荐了一种“比请求宽容而不是许可”(EAFP)的策略,而不是“看你跳跃”(LBYL)。 看到这些参考资料

EAFP vs LBYL(回复:目前有点失望)
EAFP vs. LBYL @Code就像Pythonista:习惯Python

即:

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

…优于:

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

你可以使用hasattr()或者捕获AttributeError ,但是如果你真的只想使用默认的属性值(如果不存在的话),最好的select就是使用getattr()

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

我想你正在寻找的是hasattr 。 不过,如果你想检测python属性 ,我会推荐这样的东西 –

 try: getattr(someObject, 'someProperty') except AttributeError: print "Doesn't exist" else print "Exists" 

这里的缺点是属性__get__代码中的属性错误也被捕获。

否则,

 if hasattr(someObject, 'someProp'): #Access someProp/ set someProp pass 

文档: http : //docs.python.org/library/functions.html
警告:
我推荐的原因是hasattr没有检测到属性。
链接: http : //mail.python.org/pipermail/python-dev/2005-December/058498.html

根据pydoc,hasattr(obj,prop)只需调用getattr(obj,prop)并捕获exception。 因此,使用try语句来包装属性访问同样有效,并且像事先使用hasattr()一样捕获AttributeError。

 a = SomeClass() try: return a.fake_prop except AttributeError: return default_value 

根据情况你可以检查什么样的对象,然后使用相应的属性。 随着Python 2.6 / 3.0中抽象基类的引入,这种方法也变得更加强大(基本上ABCs允许更复杂的鸭子打字方式)。

一种情况是,这是有用的,如果两个不同的对象具有同名的属性,但具有不同的含义。 只使用hasattr可能会导致奇怪的错误。

一个很好的例子是迭代器和迭代器之间的区别(见这个问题)。 迭代器中的__iter__方法和迭代器具有相同的名称,但语义上完全不同! 所以hasattr是无用的,但与ABC的isinstance一起提供了一个干净的解决scheme。

但是,我同意在大多数情况下,最合适的解决scheme是在其他答案中描述的方法。

我想build议避免这一点:

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

用户@jpalecek提到它:如果一个AttributeError发生在doStuff()内部,你就会丢失。

也许这种方法比较好:

 try: val = a.property except AttributeError: otherStuff() else: doStuff(val) 

如果你像我一样使用Python 3.6或更高版本,那么有一个方便的select来检查一个对象是否有一个特定的属性:

 if 'attr1' in obj1: print("attr1 = {}".format(obj1["attr1"])) 

但是,我不确定现在哪个是最好的方法。 使用hasattr() ,使用getattr()或使用in 。 欢迎评论。

希望你期待hasattr(),但是尽量避免hasattr(),并且更喜欢getattr()。 getattr()比hasattr()更快

使用hasattr():

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

同样在这里我使用getattr获得财产,如果没有财产它没有返回

  property = getattr(a,"property",None) if property: print property