Get all object attributes in Python?
有没有一种方法可以获取Python中对象的所有属性/方法/字段等?
vars()接近我想要的,但除非一个对象有一个__dict__并不总是正确的(例如,对于list和dict等,它是不正确的),否则它不会起作用。
使用内置函数dir()。
- 注意,dir()的行为经常被操作来显示有趣的属性,而不是严格地显示全部属性;例如,它不显示通过元类继承的属性,或者它可能被__dir__方法覆盖。
- @令牌麦克盖伊:我所需要的一切都很好…想得太多会让我头疼。;)
- 它也不显示自省属性,如func_defaults。
- @Mouad为什么我要得到这个?>>dir(pyrenderdoc)ironpython.runtime.list?
你可能想要的是dir()。
关键是类能够覆盖特殊的__dir__方法,这会导致dir()返回类想要的任何内容(尽管鼓励它们返回准确的列表,但这并不强制执行)。此外,一些对象可以通过重写__getattr__来实现动态属性,可以是RPC代理对象,也可以是C扩展类的实例。如果您的对象是这些示例中的一个,那么它们可能没有__dict__,或者无法通过__dir__提供全面的属性列表:这些对象中的许多对象可能具有如此多的动态属性,除非您尝试访问它,否则它实际上不会知道它有什么属性。
在短期内,如果dir()不够,可以编写一个函数,它对一个对象遍历__dict__,然后对obj.__class__.__mro__中的所有类执行__dict__;尽管这只对普通的python对象有效。从长远来看,你可能需要使用duck输入+假设-如果它看起来像一只鸭子,交叉你的手指,并希望它有.feathers。
- 如果我想存储dir()返回的结果怎么办?
- 不确定这是不是你要找的,但是…attrs = dir(obj)将属性数组存储为attrs中的字符串。然后,为了访问它们,您可以始终使用getattr(obj, attrs[i])来获取attrs数组中的ith属性。
- __dict__ 这个功能真的对我有很大帮助。
我用的是__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'} |
- OP特别提到他对没有__dict__的情况感兴趣,否则他可以使用vars。
- vars()接近我想要的,但除非对象有dict,否则它不会工作,而dict并不总是正确的(例如,对于列表、dict等,它不是真的)。他清楚地说那不是他想要的
您可以使用dir(your_object)获取属性,使用getattr(your_object, your_object_attr)获取值。
用途:
1 2
| for att in dir(your_object):
print (att, getattr(your_object,att)) |