如何获取Python中所有对象属性?

621 投票
4 回答
909951 浏览
提问于 2025-04-16 22:35

有没有办法在Python中获取一个对象的所有属性、方法、字段等等?

vars()这个函数离我想要的结果很接近,但是它只有在对象有一个叫__dict__的属性时才能工作,而并不是所有对象都有这个属性(比如listdict这些就没有)。

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()

撰写回答