获取Python中的所有对象属性? [复制]
Posted
技术标签:
【中文标题】获取Python中的所有对象属性? [复制]【英文标题】:Get all object attributes in Python? [duplicate] 【发布时间】:2011-10-16 17:18:42 【问题描述】:有没有办法获得所有属性/方法/字段/等。 Python 中的对象?
vars()
是 close 我想要的,但它不起作用,除非一个对象有一个 __dict__
,这并不总是正确的(例如它不是一个 @987654324 @、dict
等)。
【问题讨论】:
获取attrs
对象的属性,有__attrs_attrs__
。
【参考方案1】:
使用内置函数dir()
。
【讨论】:
请注意dir()
的行为经常被操纵以显示有趣 属性,而不是严格意义上的全部;例如,它不显示通过元类继承的属性,或者它可能被 __dir__
方法覆盖。
@TokenMacGuy:这对我需要的东西来说很好……想太多会让我头疼。 ;)
它也不显示自省属性,例如func_defaults
。
@mouad 为什么我会得到这个 >> dir(pyrenderdoc) IronPython.Runtime.List ?【参考方案2】:
我使用__dict__
和dir(<instance>)
示例:
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']
【讨论】:
OP 特别提到他对没有__dict__
的情况感兴趣 - 否则他可以使用vars
vars() 与我想要的很接近,但除非对象具有 dict,否则它不起作用,这并不总是正确的(例如,对于列表、字典等)。他明确表示这不是他想要的【参考方案3】:
你可能想要的是dir()
。
问题是类能够覆盖特殊的 __dir__
方法,这会导致 dir()
返回类想要的任何内容(尽管鼓励他们返回准确的列表,但这不是强制的)。此外,一些对象可能通过覆盖__getattr__
来实现动态属性,可能是RPC 代理对象,或者可能是C 扩展类的实例。如果您的对象是这些示例之一,它们可能没有__dict__
或 能够通过__dir__
提供全面的属性列表:其中许多对象可能具有如此多的动态属性,它没有在您尝试访问它之前,它实际上不会知道 什么。
在短期内,如果dir()
不够用,你可以编写一个函数来遍历__dict__
的对象,然后__dict__
遍历obj.__class__.__mro__
中的所有类;虽然这只适用于普通的 python 对象。从长远来看,您可能不得不使用鸭子打字+假设 - 如果它看起来像鸭子,请交叉手指,并希望它有.feathers
。
【讨论】:
如果我想存储 dir() 返回的结果怎么办? 不确定这是否是您要查找的内容,但是...attrs = dir(obj)
会将属性数组作为字符串存储在attrs
中。然后要访问它们,您始终可以使用getattr(obj, attrs[i])
来获取attrs
数组中的i
th 属性。
__dict__
这个功能对我帮助很大。【参考方案4】:
您可以使用dir(your_object)
获取属性,使用getattr(your_object, your_object_attr)
获取值
用法:
for att in dir(your_object):
print (att, getattr(your_object,att))
【讨论】:
谢谢,这是我一直在寻找的大坝时间for attr in dir(obj): print(attr +'()') if callable(getattr(obj, attr)) else print(attr)
# 将在任何可调用对象(函数、方法、类等)之后立即打印括号
顺便说一句,这种格式print(f'att : getattr(myobject,att)\n')
可以帮助您更好地阅读您的输出
attribs = lambda obj: [o for o in dir(obj) if not o.startswith('_')] 对我来说很好。以上是关于获取Python中的所有对象属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
python是不是有检查对象是不是具有属性的简写? [复制]
获取可以从python中的列表形成的所有互斥对的最快方法? [复制]