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

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

vars()是我想要的关闭,但它不工作,除非一个对象有一个__dict__,这并不总是真的(例如,它不是一个listdict等)。

751436 次浏览

使用内置函数dir()

你可能想要的是dir()

问题是类能够覆盖特殊的__dir__方法,这将导致dir()返回类想要的任何东西(尽管它们被鼓励返回一个准确的列表,但这并不是强制的)。此外,一些对象可能通过覆盖__getattr__实现动态属性,可能是RPC代理对象,也可能是c扩展类的实例。如果你的对象是这些例子之一,他们可能没有__dict__ 能够通过__dir__提供一个全面的属性列表:许多这些对象可能有如此多的动态attrs,它实际上不知道它有什么,直到你尝试访问它。

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

我使用__dict__dir(<instance>)

# EYZ0:

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']

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

用法:

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