获取Python中的所有对象属性?
有没有办法在Python中获取对象的所有属性/方法/字段等获取Python中的所有对象属性?,python,introspection,python-2.6,Python,Introspection,Python 2.6,有没有办法在Python中获取对象的所有属性/方法/字段等 vars()与我想要的很接近,但除非对象具有\uu dict\uuu,否则它不起作用,而这并不总是正确的(例如,对于列表、dict等,它不是正确的)。使用内置函数。您可能需要的是 问题在于类能够重写特殊的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。此外,一些对象可能通过覆盖
vars()
与我想要的很接近,但除非对象具有\uu dict\uuu
,否则它不起作用,而这并不总是正确的(例如,对于列表、dict
等,它不是正确的)。使用内置函数。您可能需要的是
问题在于类能够重写特殊的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。此外,一些对象可能通过覆盖\uu getattr\uuu
实现动态属性,可能是RPC代理对象,也可能是C扩展类的实例。如果您的对象是这些示例中的一个,那么它们可能没有\uuuuu dict\uuuuu
,或者无法通过\uuuuuu dir\uuuuu
提供一个全面的属性列表:这些对象中的许多可能有太多的动态属性,直到您尝试访问它时才真正知道它有什么
在短期内,如果dir()
不够,您可以为对象编写一个遍历\uuuu dict\uuuu
的函数,然后为obj中的所有类编写\uu dict\uuuu
;尽管这只适用于普通python对象。从长远来看,你可能不得不使用鸭子打字+假设-如果它看起来像鸭子,交叉你的手指,希望它有。羽毛我使用\uuu dict\uuuu
和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']
您可以使用dir(您的\u对象)
获取属性,使用getattr(您的\u对象,您的\u对象\u attr)
获取值
用法:
for att in dir(your_object):
print (att, getattr(your_object,att))
请注意,dir()
的行为经常被操纵以显示有趣的属性,而不是严格意义上的所有属性;例如,它不显示通过元类继承的属性,或者它可能会被\uuuuu dir\uuuu
方法覆盖。@TokenMacGuy:这很适合我需要的。。。想得太多会让我头疼它也不显示内省属性,例如func\u defaults
@mouad为什么通过>>dir(pyrenderdoc)IronPython.Runtime.List获得此属性?如果我想存储dir()返回的结果怎么办?不确定这是否是您要查找的,但是attrs=dir(obj)
将属性数组作为字符串存储在attrs
中。然后,要访问它们,您可以始终使用getattr(obj,attrs[i])
获取attrs
数组中的i
th属性。\uuuu dict\uuuu
这个函数对我帮助很大。OP特别提到他对没有\uuu dict\uuuu
的情况感兴趣-否则他可以使用vars
vars()接近我想要的,但除非一个对象有一个dict,否则它不起作用,而dict并不总是真的(例如,列表、dict等都不是真的)。他明确地说这不是他想要的谢谢,这是我在dir(obj)中为attr寻找很长时间的:print(attr+“()”)if callable(getattr(obj,attr))else print(attr)
#将在任何可调用(函数、方法、类等)之后立即打印括号。顺便说一句,这种格式print(f'{att}:{getattr:}(myobject,att)}\n')
可能会帮助您更好地阅读您的ouputattribs=lambda obj:[o for o in dir(obj)(如果不是的话)o.startswith('''')]对我来说很好。要获取attrs
对象的属性,有以下选项。