提问人:Lucas Gabriel Sánchez 提问时间:3/4/2009 最后编辑:Super Kai - Kazuya ItoLucas Gabriel Sánchez 更新时间:8/5/2023 访问量:1416106
如何检查对象是否有属性?
How to check if an object has an attribute?
问:
如何检查对象是否具有某些属性?例如:
>>> a = SomeClass()
>>> 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 的回答,他提供了关于请求宽恕的好建议!一个非常蟒蛇的方法!
python 中的一般做法是,如果属性可能在大部分时间都存在,只需调用它并让异常传播,或者使用 try/except 块捕获它。这可能会比 更快。如果属性可能在大多数时间都不存在,或者您不确定,则使用可能会比反复进入异常块更快。hasattr
hasattr
评论
import string hasattr(string, "lower")
hasattr
与使用 / 完全相同:hasattr 的文档字符串(在 Python 2.7 中)说它使用 getattr 手动捕获异常。try
except AttributeError
hasattr
try: ... except AttributeError:
hasattr
self
if not hasattr(self, 'property')
__init__()
我想你要找的是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
Docs:http://docs.python.org/library/functions.html
警告:
我推荐的原因是 hasattr 不检测属性。
友情链接:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
评论
hasattr
检测属性一般就好了。只是它将在 -wrapped 函数中引发异常视为表示不存在此类属性;链接的 Python 邮件列表帖子是关于一个属性,当您尝试访问它时会引发异常。出于所有实际目的,所述属性不存在,因为它永远不会产生值。此外,仅在 Py 3.1 及更早版本上通常禁止异常;在 3.2+ 中,它只抑制(替换为 return)。property
hasattr
False
AttributeError
根据 pydoc,hasattr(obj, prop) 只是调用 getattr(obj, prop) 并捕获异常。因此,用 try 语句包装属性访问并捕获 AttributeError 与事先使用 hasattr() 一样有效。
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
评论
hasattr
SomeClass
__getattr__
hasattr
AttributeError
正如贾雷特·哈迪(Jarret Hardie)所回答的那样,将做到这一点。不过,我想补充一点,Python 社区中的许多人推荐了一种“请求宽恕比请求许可更容易”(EAFP) 的策略,而不是“先看后跳”(LBYL)。请参阅以下参考资料:hasattr
EAFP vs LBYL(回复:到目前为止有点失望)
EAFP vs. LBYL @Code Like a Pythonista:惯用的 Python
结婚
try:
doStuff(a.property)
except AttributeError:
otherStuff()
...优于:
if hasattr(a, 'property'):
doStuff(a.property)
else:
otherStuff()
评论
try:
doStuff
property
AttributeError
getattr
hasattr
AttributeError
根据具体情况,您可以检查您拥有的对象类型,然后使用相应的属性。随着 Python 2.6/3.0 中抽象基类的引入,这种方法也变得更加强大(基本上 ABC 允许更复杂的鸭子类型方式)。isinstance
如果两个不同的对象具有同名但含义不同的属性,则这种情况很有用。仅使用可能会导致奇怪的错误。hasattr
一个很好的例子是迭代器和可迭代对象之间的区别(请参阅此问题)。迭代器和可迭代对象中的方法具有相同的名称,但在语义上却大不相同!所以是无用的,但与ABC一起提供了一个干净的解决方案。__iter__
hasattr
isinstance
但是,我同意在大多数情况下,这种方法(在其他答案中描述)是最合适的解决方案。hasattr
你可以使用 或 catch ,但如果你真的只想使用默认值的属性值(如果它不存在),最好的选择是使用 getattr():
hasattr()
AttributeError
getattr(a, 'property', 'default value')
评论
我想建议避免这种情况:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
用户@jpalecek提到:如果里面发生,你就迷路了。AttributeError
doStuff()
也许这种方法更好:
try:
val = a.property
except AttributeError:
otherStuff()
else:
doStuff(val)
希望您期待 hasattr(),但尽量避免 hasattr(),请首选 getattr()。getattr() 比 hasattr() 快
使用 hasattr():
if hasattr(a, 'property'):
print a.property
同样在这里,我使用 getattr 来获取属性,如果没有属性,它会返回 no
property = getattr(a,"property",None)
if property:
print property
评论
getattr() is faster than hasattr()
,中方对此有何评论?为什么更快?
False
编辑:这种方法有严重的局限性。如果对象是可迭代的对象,它应该可以工作。请查看下面的评论。
如果您像我一样使用 Python 3.6 或更高版本,则有一个方便的替代方法可以检查对象是否具有特定属性:
if 'attr1' in obj1:
print("attr1 = {}".format(obj1["attr1"]))
但是,我不确定目前哪种方法是最好的方法。使用 、 使用 或 使用 。欢迎评论。hasattr()
getattr()
in
评论
in
关键字用于检查可迭代类型。例如,抛出错误 。解决方法是在使用 之前检查类型是否可迭代。在纠正了边缘情况(如不可迭代类型)之后,您可能最好使用,因为它旨在处理边缘情况。'foo' in None
TypeError: argument of type 'NoneType' is not iterable
in
hasattr()
dict
您可以使用内置方法检查是否包含属性。object
hasattr
对于实例,如果您的对象是,并且您想要检查属性a
stuff
>>> class a:
... stuff = "something"
...
>>> hasattr(a,'stuff')
True
>>> hasattr(a,'other_stuff')
False
方法签名本身意味着如果具有传递给第二个参数的属性,则它给出布尔值或根据对象中属性的存在。hasattr(object, name) -> bool
object
hasattr
True
False
name
评论
这超级简单,只需使用 object
这将返回对象的每个可用函数和属性的列表。dir(
)
这是一个非常直观的方法:
if 'property' in dir(a):
a.property
如果a是字典,可以正常检查
if 'property' in a:
a.property
评论
另一个可能的选择,但这取决于你之前的意思:
undefined = object()
class Widget:
def __init__(self):
self.bar = 1
def zoom(self):
print("zoom!")
a = Widget()
bar = getattr(a, "bar", undefined)
if bar is not undefined:
print("bar:%s" % (bar))
foo = getattr(a, "foo", undefined)
if foo is not undefined:
print("foo:%s" % (foo))
zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
zoom()
输出:
bar:1
zoom!
这允许您检查无值属性。
但!要非常小心,不要意外地实例化和比较多个位置,因为在这种情况下永远不会起作用。undefined
is
更新:
由于我在上面的段落中警告过,有多个永远不匹配的未定义,我最近稍微修改了这个模式:
undefined = NotImplemented
NotImplemented
,不要与 混淆,是一个内置的:它与 JS 的意图半匹配,您可以在任何地方重用它的定义,并且它始终匹配。缺点是它在布尔值中是“真实的”,并且在日志和堆栈跟踪中看起来很奇怪(但当你知道它只出现在这个上下文中时,你很快就会克服它)。NotImplementedError
undefined
hasattr()
是正确的答案。我想补充的是,可以很好地与assert结合使用(以避免不必要的语句并使代码更具可读性):hasattr()
if
assert hasattr(a, 'property'), 'object lacks property'
print(a.property)
如果缺少该属性,程序将退出并打印出提供的错误消息(在本例中)。AssertionError
object lacks property
正如在关于 SO 的另一个回答中所述:
断言应该用于测试不应该发生的条件。 目的是在程序状态损坏的情况下尽早崩溃。
通常,当属性丢失时,情况就非常合适。assert
评论
hasattr
对于字典以外的对象:
if hasattr(a, 'property'):
a.property
对于字典,将不起作用。hasattr()
很多人都说要用字典,但它被贬值了。
所以对于字典,你必须使用has_key()
has_attr()
if a.has_attr('property'):
a['property']
或者你也可以使用
if 'property' in a:
评论
if 'property' in a:
您可以使用 hasattr() 来检查对象或类在 Python 中是否有属性。
例如,有如下所示的 Person
类:
class Person:
greeting = "Hello"
def __init__(self, name, age):
self.name = name
self.age = age
def test(self):
print("Test")
然后,你可以对对象使用 hasattr(),如下所示:
obj = Person("John", 27)
obj.gender = "Male"
print("greeting:", hasattr(obj, 'greeting'))
print("name:", hasattr(obj, 'name'))
print("age:", hasattr(obj, 'age'))
print("gender:", hasattr(obj, 'gender'))
print("test:", hasattr(obj, 'test'))
print("__init__:", hasattr(obj, '__init__'))
print("__str__:", hasattr(obj, '__str__'))
print("__module__:", hasattr(obj, '__module__'))
输出:
greeting: True
name: True
age: True
gender: True
test: True
__init__: True
__str__: True
__module__: True
而且,您也可以直接使用 hasattr() 作为类名,如下所示:
print("greeting:", hasattr(Person, 'greeting'))
print("name:", hasattr(Person, 'name'))
print("age:", hasattr(Person, 'age'))
print("gender:", hasattr(Person, 'gender'))
print("test:", hasattr(Person, 'test'))
print("__init__:", hasattr(Person, '__init__'))
print("__str__:", hasattr(Person, '__str__'))
print("__module__:", hasattr(Person, '__module__'))
输出:
greeting: True
name: False
age: False
gender: False
test: True
__init__: True
__str__: True
__module__: True
评论
hasattr()
AttributeError
装饰器和内置属性,它们与普通属性/方法略有不同。