如何知道一个对象是否在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