关于内省:获取python中的所有对象属性?

Get all object attributes in Python?

有没有一种方法可以获取Python中对象的所有属性/方法/字段等?

vars()接近我想要的,但除非一个对象有一个__dict__并不总是正确的(例如,对于listdict等,它是不正确的),否则它不会起作用。


使用内置函数dir()


你可能想要的是dir()

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

在短期内,如果dir()不够,可以编写一个函数,它对一个对象遍历__dict__,然后对obj.__class__.__mro__中的所有类执行__dict__;尽管这只对普通的python对象有效。从长远来看,你可能需要使用duck输入+假设-如果它看起来像一只鸭子,交叉你的手指,并希望它有.feathers


我用的是__dict__

例子:

1
2
3
4
5
6
7
8
9
10
class MyObj(object):
  def __init__(self):
    self.name = 'Chuck Norris'
    self.phone = '+6661'

obj = MyObj()
print(obj.__dict__)

# Output:  
# {'phone': '+6661', 'name': 'Chuck Norris'}


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

用途:

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