如何检查对象是否具有某些属性?例如:
>>> 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'
如何在使用属性属性之前确定它是否具有属性属性?
当前回答
这非常简单,只需使用dir(object)这将返回对象的每个可用函数和属性的列表。
其他回答
我想你要找的是哈萨特。然而,如果您想检测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 2.6/3.0中抽象基类的引入,这种方法也变得更加强大(基本上,ABC允许更复杂的鸭子类型)。
一种有用的情况是,如果两个不同的对象具有相同名称但含义不同的属性。仅使用hasattr可能会导致奇怪的错误。
一个很好的例子是迭代器和可迭代器之间的区别(参见这个问题)。迭代器和可迭代器中的__iter_方法具有相同的名称,但在语义上完全不同!因此,hasattr是无用的,但它与ABC一起提供了一个干净的解决方案。
然而,我同意在大多数情况下,hasattr方法(在其他答案中描述)是最合适的解决方案。
hasattr()是正确的答案。我想补充的是,hasattr()可以很好地与assert结合使用(以避免不必要的if语句,并使代码更可读):
assert hasattr(a, 'property'), 'object lacks property'
print(a.property)
如果缺少属性,程序将退出并显示AssertionError,并打印出提供的错误消息(在这种情况下,对象缺少属性)。
如SO的另一份答复所述:
断言应该用于测试不应该发生的条件。目的是在程序状态损坏的情况下尽早崩溃。
通常情况下,如果缺少属性,那么断言是非常合适的。
编辑:这种方法有严重的局限性。如果对象是一个可迭代的对象,它应该可以工作。请检查下面的评论。
如果您像我一样使用Python 3.6或更高版本,有一种方便的方法可以检查对象是否具有特定属性:
if 'attr1' in obj1:
print("attr1 = {}".format(obj1["attr1"]))
然而,我不确定目前哪种方法是最好的。使用hasattr()、getattr(()或in。欢迎评论。
这里有一个非常直观的方法:
if 'property' in dir(a):
a.property
如果a是字典,您可以正常检查
if 'property' in a:
a.property