获取Python中的所有对象属性?

Meh*_*dad 336 python introspection python-2.6

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

vars()接近我想要的,但它不起作用,除非一个对象有一个__dict__,这并不总是正确的(例如,它不适用于a list,a dict等).

mou*_*uad 451

使用内置功能dir().

  • 请注意,`dir()`的行为经常被操纵以显示*有趣的*属性,而不是严格的全部; 例如,它不显示通过元类继承的属性,或者可以使用`__dir__`方法覆盖它. (12认同)
  • @TokenMacGuy:这对我需要的东西很好......想太多会让我头疼.;) (6认同)

Eli*_*ins 81

你可能想要的是什么dir().

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

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

  • 不确定这是否是您正在寻找的,但是......`attrs = dir(obj)`会将属性数组存储为`attrs`中的字符串.然后要访问它们,你总是可以使用`getattr(obj,attrs [i])`来获取`attrs`数组中的`i`th属性. (5认同)
  • `__dict__ ` 这个功能真的帮了我很多。 (2认同)

Sli*_*eam 64

我用 __dict__

示例:

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

obj = MyObj()
print(obj.__dict__)

# Output:  
# {'phone': '+6661', 'name': 'Chuck Norris'}
Run Code Online (Sandbox Code Playgroud)

  • OP*具体*提到他对没有`__dict__`的情况感兴趣 - 否则他可以使用`vars` (13认同)
  • vars() 接近我想要的,但除非对象有 __dict__ ,否则它不起作用,这并不总是正确的(例如,对于列表、字典等来说,它不是正确的)。他明确表示这不是他想要的 (2认同)

Jas*_*gel 16

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

用法:

for att in dir(your_object):
    print (att, getattr(your_object,att))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这就是我寻找了很长一段时间的东西 (2认同)
  • `for attr in dir(obj): print(attr +'()') if callable(getattr(obj, attr)) else print(attr)` # 将在任何可调用对象(函数、方法、类等)之后立即打印括号.) (2认同)
  • attribs = lambda obj: [o for o in dir(obj) if not o.startswith('_')] 对我来说效果很好。 (2认同)