如何检查对象是否具有某些属性?例如:
>>> a = SomeClass()
>>> a.property
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'
如何在使用属性属性之前确定它是否具有属性属性?
如何检查对象是否具有某些属性?例如:
>>> a = SomeClass()
>>> a.property
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'
如何在使用属性属性之前确定它是否具有属性属性?
当前回答
我想你要找的是哈萨特。然而,如果您想检测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
其他回答
正如贾雷特·哈迪回答的那样,哈沙特会做这个把戏。不过,我想补充一点,Python社区中的许多人建议采用“请求宽恕比请求许可更容易”(EAFP)而不是“三思而后行”(LBYL)的策略。参见以下参考文献:
EAFP vs LBYL(Re:到目前为止有点失望)EAFP与LBYL@代码如蟒蛇:惯用Python
ie:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
…优先于:
if hasattr(a, 'property'):
doStuff(a.property)
else:
otherStuff()
尝试hasattr():
if hasattr(a, 'property'):
a.property
请看下面zweiterlinde的回答,他提供了关于请求宽恕的好建议!一个非常蟒蛇的方法!
python中的一般做法是,如果属性大部分时间都可能存在,那么只需调用它,让异常传播,或者用try/except块捕获它。这可能比hasattr更快。如果属性可能在大多数时间都不存在,或者您不确定,那么使用hasattr可能会比重复陷入异常块更快。
您可以使用hasattr()或catch AttributeError,但如果您真的只希望属性的值具有默认值(如果不存在),最好的选择就是使用getattr(
getattr(a, 'property', 'default value')
我想你要找的是哈萨特。然而,如果您想检测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
hasattr()是正确的答案。我想补充的是,hasattr()可以很好地与assert结合使用(以避免不必要的if语句,并使代码更可读):
assert hasattr(a, 'property'), 'object lacks property'
print(a.property)
如果缺少属性,程序将退出并显示AssertionError,并打印出提供的错误消息(在这种情况下,对象缺少属性)。
如SO的另一份答复所述:
断言应该用于测试不应该发生的条件。目的是在程序状态损坏的情况下尽早崩溃。
通常情况下,如果缺少属性,那么断言是非常合适的。