如何检查对象是否具有某些属性?例如:
>>> 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'
如何在使用属性属性之前确定它是否具有属性属性?
当前回答
另一种可能的选择,但这取决于您之前的意思:
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!
这甚至允许您检查无值属性。
但是要非常小心,不要意外地实例化和比较未定义的多个位置,因为在这种情况下is永远不会工作。
更新:
由于我在上面的段落中警告过,有多个从未匹配的未定义,我最近稍微修改了这个模式:
undefined=未实现
NotImplemented(不要与NotImplementedError混淆)是一个内置的:它与JS undefined的意图半匹配,您可以在任何地方重用它的定义,并且它总是匹配的。缺点是它在布尔值中是“真实的”,在日志和堆栈跟踪中看起来很奇怪(但当你知道它只出现在这个上下文中时,你很快就会忘记它)。
其他回答
您可以使用hasattr()或catch AttributeError,但如果您真的只希望属性的值具有默认值(如果不存在),最好的选择就是使用getattr(
getattr(a, 'property', 'default value')
这里有一个非常直观的方法:
if 'property' in dir(a):
a.property
如果a是字典,您可以正常检查
if 'property' in a:
a.property
hasattr()是正确的答案。我想补充的是,hasattr()可以很好地与assert结合使用(以避免不必要的if语句,并使代码更可读):
assert hasattr(a, 'property'), 'object lacks property'
print(a.property)
如果缺少属性,程序将退出并显示AssertionError,并打印出提供的错误消息(在这种情况下,对象缺少属性)。
如SO的另一份答复所述:
断言应该用于测试不应该发生的条件。目的是在程序状态损坏的情况下尽早崩溃。
通常情况下,如果缺少属性,那么断言是非常合适的。
根据pydoc,hasattr(obj,prop)只是调用getattr(obj,prop)并捕获异常。因此,用try语句包装属性访问并捕获AttributeError与预先使用hasattr()一样有效。
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
对于字典以外的对象:
if hasattr(a, 'property'):
a.property
对于字典,hasattr()将不起作用。
许多人都在告诉字典使用has_key(),但它已经贬值了。因此,对于字典,必须使用has_attr()
if a.has_attr('property'):
a['property']
或者您也可以使用
if 'property' in a: