如何知道对象在python中是否有属性

How to know if an object has an attribute in Python

is there to Python的方式确定对象的属性,如果安has some?for example:P></

1
2
3
4
5
6
>>> 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'

你怎么能告诉如果ahas the propertybefore using属性页?P></


hasattr()试试:

1
2
if hasattr(a, 'property'):
    a.property

编辑:看下面的答案zweiterlinde提供好的建议,我们forgiveness问谁!方法超Python!

一般的做法是,在Python中,如果房地产可能会有一大部分时间,与简单的呼叫它或者让它与异常propagate陷阱,或尝试/除块。这可能会比hasattr更快。如果属性是不可能在那里的大部分时间,或你不确定,可能会被利用hasattr更快比降到repeatedly异常块。


哈迪的hasattr贾勒特说,威尔的戏法。我想添加,虽然在Python社区,这是许多战略"的建议更容易就让forgiveness)比(E(AFP)"而不是"看在你跳"(lbyl)。这些参考文献:国有企业

lbyl(E(AFP):是再小disappointed为止)E(AFP)lbyl @样idiomatic pythonista:Python代码

即:

1
2
3
4
try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

…………………优先考虑:

1
2
3
4
if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()


你可以使用AttributeErrorhasattr()或捕捉,但如果你真的只是想与默认值的属性,如果它是不是最好的选择是有,只是用getattr()

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


你是我想找的是hasattr。然而,像这样的东西,我建议你要到Python的性能检测

1
2
3
4
5
6
try:
    getattr(someObject, 'someProperty')        
except AttributeError:
    print"Doesn't exist"
else
    print"Exists"

这里的缺点是,在__get__代码错误性质的属性也被抓住了。

此外,的

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

文档:http://docs.python.org /图书馆/ functions.html警告:那是我的推荐的原因是不是hasattr检测性能。链接:http://mail.python.org pipermail Python开发/ / / / 058498.html 2005年十二月


根据pydoc hasattr(obj,道具),简单的调用getattr(obj,道具)和捕获异常。所以,它是有效的,只是在对包的属性访问尝试和捕捉attributeerror语句与它使用的hasattr(前)。

1
2
3
4
5
a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value


我想这suggest避免:

1
2
3
4
try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

"用户"一文jpalecek:如果它发生在你的AttributeErrordoStuff(),失落。

也许这是更好的方法。

1
2
3
4
5
6
try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)


根据检查的情况下,你可以做什么,你有一个什么样的isinstance对象,然后使用相应的属性。摘要介绍基本的Python中的类/方法2.6 3.0,这也成为强大的,更大的(基本上允许更复杂的字母式的鸭打字)。

这是一个有用的情况是,如果两个不同的对象将有一个属性与相同的名称,但具有不同的意义。然后利用奇异hasattr只会导致错误。

一个很好的例子是迭代器和学习之间的区别(见这个问题)。该方法在__iter__迭代器和一个迭代变量相同的名称,但不同的是semantically地狱!操作系统hasattr是无用的,但isinstanceABC’s一起提供了清洁的解决方案。

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


希望你expecting hasattr(),但是试图避免hasattr getattr请选择()和()。getattr()是一hasattr(比)。

利用hasattr():

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

它让我在这里使用getattr物业,如果物业没有它不返回

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

编辑:这个方法有严重的局限性。它应该工作,如果一个对象是一个迭代变量。请检查下面的评论。

如果你是使用Python或高3.6样我有一个方便的替代CT检查是否有特定的属性:一个对象

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

然而,我不知道这是最好的办法了吧。利用hasattr(),利用getattr()in或使用。的意见是受欢迎的。


这非常简单,只需使用dir(对象)。这将返回对象的每个可用函数和属性的列表。


您可以使用hasattr内置方法检查object是否包含属性。

例如,如果您的对象是a并且您想要检查属性stuff

1
2
3
4
5
6
7
>>> class a:
...     stuff ="something"
...
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

方法签名本身是hasattr(object, name) -> bool,这意味着如果object具有属性,该属性被传递给hasattr中的第二个参数,而根据对象中name属性的存在,它给出了布尔的TrueFalse