如何获取Python中所有对象属性?
有没有办法在Python中获取一个对象的所有属性、方法、字段等等?
vars()
这个函数离我想要的结果很接近,但是它只有在对象有一个叫__dict__
的属性时才能工作,而并不是所有对象都有这个属性(比如list
、dict
这些就没有)。
4 个回答
123
你可能想要的是 dir()
这个函数。
不过,有一点需要注意的是,类可以重写一个特殊的方法 __dir__
,这就意味着 dir()
返回的内容可以由类自己决定(虽然建议返回准确的列表,但并没有强制要求)。此外,有些对象可能通过重写 __getattr__
来实现动态属性,或者可能是远程过程调用(RPC)代理对象,或者是 C 扩展类的实例。如果你的对象属于这些情况,它们可能没有 __dict__
,或者无法通过 __dir__
提供一个完整的属性列表:很多这样的对象可能有太多动态属性,实际上在你尝试访问之前,它们自己也不知道拥有什么。
短期内,如果 dir()
不够用,你可以写一个函数,遍历对象的 __dict__
,然后再遍历所有类的 __dict__
,这些类可以通过 obj.__class__.__mro__
获取;不过这只适用于普通的 Python 对象。长期来看,你可能需要使用鸭子类型和一些假设——如果它看起来像只鸭子,就祈祷它有 .feathers
属性。
190
我使用 __dict__
和 dir(<实例>)
示例:
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']
810
使用内置的函数 dir()
。