如何检查对象是否具有属性?

2024-12-27 08:46:00
admin
原创
137
摘要:问题描述:如何检查对象是否具有某些属性?例如:>>> a = SomeClass() >>> a.property Traceback (most recent call last): File "<stdin>", line 1, in...

问题描述:

如何检查对象是否具有某些属性?例如:

>>> a = SomeClass()
>>> a.property
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'

在使用它之前如何判断它是否a具有该属性property


解决方案 1:

尝试hasattr()

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

请参阅下面zweiterlinde 的回答,他提供了关于请求原谅的好建议!非常 Python 化的方法!

Python 中的一般做法是,如果该属性很可能大部分时间都存在,则只需调用它并让异常传播,或使用 try/except 块捕获它。这可能比 更快hasattr。如果该属性很可能大部分时间都不存在,或者您不确定,则使用hasattr可能比反复陷入异常块更快。

解决方案 2:

正如Jarret Hardie所回答的,hasattr这可以解决问题。不过,我想补充一点,Python 社区中的许多人都推荐一种“更容易请求原谅而不是许可”(EAFP)的策略,而不是“三思而后行”(LBYL)的策略。请参阅以下参考资料:

EAFP 与 LBYL(回复:到目前为止有点失望)

EAFP 与 LBYL @Code Like a Pythonista:惯用的 Python

IE:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... 优于:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

解决方案 3:

您可以使用hasattr()或捕获AttributeError,但如果您真的只是想要具有默认值的属性值(如果不存在),最好的选择就是使用getattr()

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

解决方案 4:

我认为您正在寻找的是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-December/058498.html

解决方案 5:

根据 pydoc,hasattr(obj, prop) 只是调用 getattr(obj, prop) 并捕获异常。因此,使用 try 语句包装属性访问并捕获 AttributeError 与事先使用 hasattr() 一样有效。

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

解决方案 6:

我建议避免这种情况:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

用户@jpalecek 提到了这一点:如果AttributeError在里面出现doStuff(),你就输了。

也许这种方法更好:

try:
    val = a.property
except AttributeError:
    otherStuff()
else:
    doStuff(val)

解决方案 7:

对于字典以外的对象:

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

对于字典来说,hasattr()将不起作用。

很多人都说要用has_key()字典,但是它已经贬值了。所以对于字典,你必须使用has_attr()

if a.has_attr('property'):
    a['property']
 

或者您也可以使用

if 'property' in a:

解决方案 8:

hasattr()是正确的答案。我想补充的是,hasattr()可以很好地与assert结合使用(以避免不必要的if语句并使代码更具可读性):

assert hasattr(a, 'property'), 'object lacks property' 
print(a.property)

如果缺少该属性,程序将退出AssertionError并打印出所提供的错误消息(object lacks property在这种情况下)。

正如另一个关于SO的回答所述:

断言应该用来测试不应该发生的情况。目的是在程序状态损坏的情况下尽早崩溃。

通常当某个属性缺失并且assert非常合适时就会出现这种情况。

解决方案 9:

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

如果你像我一样使用Python 3.6或更高版本,那么有一种方便的替代方法可以检查对象是否具有特定属性:

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

但是,我不确定现在哪种方法最好。使用hasattr()、使用getattr()还是使用in。欢迎发表评论。

解决方案 10:

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

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

如果是字典,你可以正常检查

if 'property' in a:
    a.property

解决方案 11:

根据具体情况,您可以检查isinstance您拥有的对象类型,然后使用相应的属性。随着Python 2.6/3.0 中抽象基类的引入,这种方法也变得更加强大(基本上 ABC 允许更复杂的鸭子类型方法)。

一个有用的情况是,如果两个不同的对象有一个同名但含义不同的属性。使用 onlyhasattr可能会导致奇怪的错误。

一个很好的例子是迭代器和可迭代对象之间的区别(参见这个问题)。__iter__迭代器和可迭代对象中的方法具有相同的名称,但在语义上却截然不同!所以hasattr没用,但isinstance与 ABC 一起提供了一个干净的解决方案。

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

解决方案 12:

希望您期待 hasattr(),但请尽量避免使用 hasattr() 并优先使用 getattr()。getattr() 比 hasattr() 更快。

使用 hasattr():

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

同样,我使用 getattr 来获取属性,如果没有属性,则返回 none

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

解决方案 13:

您可以使用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

解决方案 14:

这非常简单,只需使用dir(对象)

这将返回对象的每个可用函数和属性的列表。

解决方案 15:

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

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

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

方法签名本身的hasattr(object, name) -> bool意思是,如果object具有传递给第二个参数的属性hasattr,那么它会给出布尔值TrueFalse根据对象中属性的存在而定name

解决方案 16:

另一种可能的选择,但这取决于你之前的意思:

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(不要与 混淆NotImplementedError)是内置的:它半匹配 JS 的意图undefined,您可以在任何地方重复使用其定义,并且它始终匹配。缺点是它在布尔值中是“真值”,并且在日志和堆栈跟踪中看起来很奇怪(但当您知道它只出现在此上下文中时,您很快就会克服它)。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1590  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1361  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   18  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   18  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   19  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用