有没有办法在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


#1楼

我想建议避免这个:

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

用户@jpalecek提到它:如果在doStuff()内发生AttributeError则会丢失。

也许这种方法更好:

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

#2楼

希望你期待hasattr(),但尽量避免使用hasattr(),请更喜欢getattr()。 getattr()比hasattr()更快

使用hasattr():

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

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

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

#3楼

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

如果您像我一样使用Python 3.6或更高版本,则有一个方便的替代方法来检查对象是否具有特定属性:

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

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


#4楼

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

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

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

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


#5楼

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


#6楼

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

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

#7楼

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

undefined = object()class Widget:def __init__(self):self.bar = 1def 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绝不会在这种情况下工作。


#8楼

尝试hasattr()

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

编辑:请参阅下面的zweiterlinde的答案 ,谁提供了关于请求宽恕的好建议! 一种非常pythonic的方法!

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


#9楼

我认为你要找的是hasattr 。 但是,如果你想检测python属性 ,我会推荐这样的东西 -

try:getattr(someObject, 'someProperty')
except AttributeError:print "Doesn't exist"
elseprint "Exists"

这里的缺点是属性__get__代码中的属性错误也被捕获。

否则,做 -

if hasattr(someObject, 'someProp'):#Access someProp/ set someProppass

文档: http : //docs.python.org/library/functions.html
警告:
我推荐的原因是hasattr没有检测到属性。
链接: http : //mail.python.org/pipermail/python-dev/2005-December/058498.html


#10楼

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

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

#11楼

正如Jarret Hardie回答的那样, hasattr将会做到这一点。 不过,我想补充一点,Python社区中的许多人都建议采用“更容易请求宽恕而不是许可”(EAFP)的策略,而不是“在你跳跃之前先看”(LBYL)。 见这些参考文献:

EAFP对LBYL(Re:到目前为止有点失望)
EAFP vs. LBYL @Code就像一个Pythonista:惯用语

即:

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

...优先:

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

#12楼

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

一种情况是,如果两个不同的对象具有相同名称但具有不同含义的属性,则这是有用的。 仅使用hasattr可能会导致奇怪的错误。

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

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


#13楼

你可以使用hasattr()或catch AttributeError ,但如果你真的只想要属性的值,如果不存在,那么最好的选择就是使用getattr()

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

如何知道对象在Python中是否具有属性相关推荐

  1. Python中的魔法属性

    魔法属性 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method,例如类的初始化方法 __init__() ,实例对象创造方法 __new__()等. 魔法属性和方法 ...

  2. python中属于私有属性的是_Python中的实例属性和私有属性

    相关知识点 实例属性 实例属性和类属性的区别在于实例属性定义在类的__init__()魔法方法中,而类属性定义在类下: 1 classC:2 b = 1 #类属性 3 4 def __init__(s ...

  3. python中的类属性、实例属性、类方法、实例方法

    定义类 class Person():pass 创建实例 xiaoming = Person() xiaohong = Person() 实例属性 xiaoming = Person() xiaomi ...

  4. python语言中一切皆对象_2 python 中一切皆对象

    python 中一皆对象 在 python 编程语言中所有的一切都是对象 , python 语言相对于 C++ 或 java 这样的语言 (静态语言), 面向对象这个思想更加的彻底. 2.1 函数和类 ...

  5. python中实例方法与实例属性-Python中的类属性和实例属性以及静态方法和类方法...

    可以在Python的类定义中直接添加静态变量,如下例中的foo.此属性属于类C,可以直接通过C.foo访问,而无需实例化它.而实例属性则只存在于对象的实例中,这也就意味着,每一个不同的实例都有只属于自 ...

  6. python中的类属性和类方法_python面向对象之类属性和类方法的使用和实例

    类属性和类方法 目标 类的结构类属性和实例属性类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 1. 使用面相对象开发,第 1 步 是设计 类 2. 使用 类名() 创建对象,创建对象 的 ...

  7. python中的魔法属性和方法

    魔法属性: 首先,我们先谈一谈什么叫做魔法属性? 魔法属性和方法是Python内置的一些属性和方法,有着特殊的含义.命名时前后加上两个下划线,在执行系统特定操作时,会自动调用. 那么接下来,我们就列举 ...

  8. Python中的类属性和实例属性以及静态方法和类方法

    2019独角兽企业重金招聘Python工程师标准>>> 可以在Python的类定义中直接添加静态变量,如下例中的foo.此属性属于类C,可以直接通过C.foo访问,而无需实例化它.而 ...

  9. Python中的类属性和类方法(静态方法、私有属性和私有方法)

    一.类属性和类方法 类的方法 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数 代码块: class Student(object ...

最新文章

  1. 【网摘】GTK中文显示解决方案
  2. 20145220韩旭飞《网络对抗》Exp6 信息搜集与漏洞扫描
  3. python怎么打开交互式窗口-在交互式环境中执行Python程序过程详解
  4. MYSQL管理之主从同步管理
  5. overall error
  6. spring boot 引用外部配置文件
  7. 启明云端分享:产品应用上,怎么选型ESP-12F\ESP-12E\ESP-12S\ESP-07S这四个模块
  8. atomic在linux编译不通过,内存障碍和在linux上的atomic_t
  9. 调研《构建之法》指导下的优秀实践作品三篇
  10. contentprovider的学习实例总结
  11. ENVI入门系列教程---一、数据预处理---5. 图像自动配准
  12. 无法编辑PDF文档?看完这篇文章即刻解决~
  13. python刷屏代码_python 刷屏
  14. qq互联php教程,thinkphp5怎么整合qq互联登录教程
  15. MATLAB去除多余点的命令,如何清除matlab命令窗口中已有的内容
  16. 如何卸载office201032位_企业如何利用Ansys Mechanical缩减设计时间、验证设计迭代?...
  17. ROS话题通信c++和python实现
  18. python对缩进太敏感...a_a
  19. 微积分精简版复习提纲
  20. C#chart绘折线图动态添加数据

热门文章

  1. Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
  2. 内网监控利器——Nagios
  3. 【转】Entity Framework教程
  4. 我如何转行为程序员?心态支撑着我
  5. 删除Github上项目
  6. Android:读取assets目录下文件(二)
  7. sprintf函数、snprintf函数、asprintf函数、vsprintf
  8. Oracle 数据类型 选择自 tjandy 的 Blog
  9. MySQL数据库中的删除命令:delete、truncate、drop
  10. 38个Pandas实用技巧