有没有办法在Python中确定对象是否具有某些属性?例如:
>>> a = SomeClass() >>> a.someProperty = value >>> a.property Traceback (most recent call last): File "", line 1, in 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 vs LBYL(Re:有点失望)
EAFP vs. LBYL @Code就像Pythonista:惯用语Python
即:
try: doStuff(a.property) except AttributeError: otherStuff()
...优先:
if hasattr(a, 'property'): doStuff(a.property) else: otherStuff()
你可以使用hasattr()
或者捕获AttributeError
,但是如果你真的只想要属性的值,如果它不存在,那么最好的选择就是使用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)并捕获异常.因此,使用try语句包装属性访问并捕获AttributeError同样有效,因为它是事先使用hasattr().
a = SomeClass() try: return a.fake_prop except AttributeError: return default_value
我想建议避免这个:
try: doStuff(a.property) except AttributeError: otherStuff()
用户@jpalecek提到它:如果AttributeError
内部发生doStuff()
,你就会迷路.
也许这种方法更好:
try: val = a.property except AttributeError: otherStuff() else: doStuff(val)
根据具体情况,您可以检查isinstance
您拥有的对象类型,然后使用相应的属性.随着Python 2.6/3.0 中抽象基类的引入,这种方法也变得更加强大(基本上ABCs允许更复杂的鸭子打字方式).
一种情况是,如果两个不同的对象具有相同名称但具有不同含义的属性,则这是有用的.仅使用hasattr
可能会导致奇怪的错误.
一个很好的例子是迭代器和迭代器之间的区别(参见这个问题).将__iter__
在迭代器和迭代方法具有相同的名称,但在语义上是完全不同的!所以hasattr
没用,但isinstance
与ABC一起提供了一个干净的解决方案.
但是,我同意在大多数情况下,这种hasattr
方法(在其他答案中描述)是最合适的解决方案.
希望你期待hasattr(),但尽量避免使用hasattr(),请更喜欢getattr().getattr()比hasattr()更快
使用hasattr():
if hasattr(a, 'property'): print a.property
同样在这里我使用getattr来获取属性,如果没有属性则返回none
property = getattr(a,"property",None) if property: print property
编辑:这种方法有严重的局限性.如果对象是可迭代的,它应该工作.请查看以下评论.
如果您像我一样使用Python 3.6或更高版本,则有一个方便的替代方法来检查对象是否具有特定属性:
if 'attr1' in obj1: print("attr1 = {}".format(obj1["attr1"]))
但是,我不确定现在哪种方法最好.使用hasattr()
,使用getattr()
或使用in
.欢迎评论.