获取Python中的所有对象属性? [复制]

Posted

技术标签:

【中文标题】获取Python中的所有对象属性? [复制]【英文标题】:Get all object attributes in Python? [duplicate] 【发布时间】:2011-10-16 17:18:42 【问题描述】:

有没有办法获得所有属性/方法/字段/等。 Python 中的对象?

vars()close 我想要的,但它不起作用,除非一个对象有一个 __dict__,这并不总是正确的(例如它不是一个 @987654324 @、dict 等)。

【问题讨论】:

获取attrs对象的属性,有__attrs_attrs__ 【参考方案1】:

使用内置函数dir()

【讨论】:

请注意dir() 的行为经常被操纵以显示有趣 属性,而不是严格意义上的全部;例如,它不显示通过元类继承的属性,或者它可能被 __dir__ 方法覆盖。 @TokenMacGuy:这对我需要的东西来说很好……想太多会让我头疼。 ;) 它也不显示自省属性,例如func_defaults @mouad 为什么我会得到这个 >> dir(pyrenderdoc) IronPython.Runtime.List ?【参考方案2】:

我使用__dict__dir(<instance>)

示例

class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)
print(dir(obj))

# Output:  
# obj.__dict__ --> 'phone': '+6661', 'name': 'Chuck Norris'
#
# dir(obj)     --> ['__class__', '__delattr__', '__dict__', '__doc__',
#               '__format__', '__getattribute__', '__hash__', 
#               '__init__', '__module__', '__new__', '__reduce__', 
#               '__reduce_ex__', '__repr__', '__setattr__', 
#               '__sizeof__', '__str__', '__subclasshook__', 
#               '__weakref__', 'name', 'phone']

【讨论】:

OP 特别提到他对没有__dict__的情况感兴趣 - 否则他可以使用vars vars() 与我想要的很接近,但除非对象具有 dict,否则它不起作用,这并不总是正确的(例如,对于列表、字典等)。他明确表示这不是他想要的【参考方案3】:

你可能想要的是dir()

问题是类能够覆盖特殊的 __dir__ 方法,这会导致 dir() 返回类想要的任何内容(尽管鼓励他们返回准确的列表,但这不是强制的)。此外,一些对象可能通过覆盖__getattr__ 来实现动态属性,可能是RPC 代理对象,或者可能是C 扩展类的实例。如果您的对象是这些示例之一,它们可能没有__dict__ 能够通过__dir__ 提供全面的属性列表:其中许多对象可能具有如此多的动态属性,它没有在您尝试访问它之前,它实际上不会知道 什么

在短期内,如果dir() 不够用,你可以编写一个函数来遍历__dict__ 的对象,然后__dict__ 遍历obj.__class__.__mro__ 中的所有类;虽然这只适用于普通的 python 对象。从长远来看,您可能不得不使用鸭子打字+假设 - 如果它看起来像鸭子,请交叉手指,并希望它有.feathers

【讨论】:

如果我想存储 dir() 返回的结果怎么办? 不确定这是否是您要查找的内容,但是...attrs = dir(obj) 会将属性数组作为字符串存储在attrs 中。然后要访问它们,您始终可以使用getattr(obj, attrs[i]) 来获取attrs 数组中的ith 属性。 __dict__ 这个功能对我帮助很大。【参考方案4】:

您可以使用dir(your_object) 获取属性,使用getattr(your_object, your_object_attr) 获取值

用法:

for att in dir(your_object):
    print (att, getattr(your_object,att))

【讨论】:

谢谢,这是我一直在寻找的大坝时间 for attr in dir(obj): print(attr +'()') if callable(getattr(obj, attr)) else print(attr) # 将在任何可调用对象(函数、方法、类等)之后立即打印括号 顺便说一句,这种格式print(f'att : getattr(myobject,att)\n') 可以帮助您更好地阅读您的输出 attribs = lambda obj: [o for o in dir(obj) if not o.startswith('_')] 对我来说很好。

以上是关于获取Python中的所有对象属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python是不是有检查对象是不是具有属性的简写? [复制]

获取可以从python中的列表形成的所有互斥对的最快方法? [复制]

Python中的这个属性语法是啥? [复制]

在Python中按属性获取对象列表中的索引

如何在 python 中获取声音文件(.wav)的时间长度? [复制]

Django - 从模型中的所有对象中获取第一个属性