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的回答,他们提供了有关请求宽恕的好建议!一种非常pythonic的方法!

python中的一般做法是,如果属性可能在大多数时间都存在,只需调用它并让异常传播,或者使用try / except块捕获它。这可能比 hasattr 更快。如果该属性可能在大多数情况下不存在,或者您不确定,使用 hasattr 可能会比重复进入异常块更快。

其他提示

Jarret Hardie 回答, hasattr 将会解决问题。不过,我想补充一点,Python社区中的许多人都建议采用“更容易请求宽恕而非许可”的策略。 (EAFP)而不是“在你跳跃之前” (LBYL)。请参阅以下参考资料:

EAFP对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-腊/ 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提到它:如果在 doStuff()中发生 AttributeError ,则会丢失。

也许这种方法更好:

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获取属性如果没有属性则返回无

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

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

如果您正在使用 Python 3.6 或像我这样更高级别的人有一个方便的替代方法来检查对象是否具有特定属性:

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

但是,我不确定现在哪种方法是最好的方法。使用 hasattr(), , 使用 getattr() 或使用 in. 。欢迎评论。

这是一种非常直观的方法:

if 'property' in dir(a):
    a.property

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

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

>>> class a:
...     stuff = "something"
... 
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False

方法签名本身是 hasattr(object,name) - &gt; bool ,这意味着如果 object 具有属性,它被传递给 hasattr 中的第二个参数,而不是它给出boolean True name 属性的存在,代码>或 False

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top