正如SE上提到的,可以使用dir(someObject)
或someObject.__dict__
获得对象的所有可迭代属性。如何获得不可迭代的属性?某些库(如 Reqests)返回具有不可迭代属性的对象。
在任何情况下可靠地列出所有属性,因为一个简单的事实是,属性可以在运行时使用 __getattr__
或 __getattribute__
定义。
例如,以下类有 50% 的机会创建新属性或引发AttributeError
。
import random
class AttributeGenerator(object):
def __getattr__(self, attr):
if random.random() < 0.5:
setattr(self, attr, None)
return getattr(self, attr)
else:
raise AttributeError(attr)
从实例获取属性的唯一通用函数是 dir()
和 vars()
。
请注意,默认情况下dir()
结合了__dict__
、__slots__
和类__dict__
等获得的结果。 类可以通过定义__dir__
方法来重新定义dir()
在其实例上的工作方式,但我从未见过使用它。如果此方法存在并且由于某种原因"隐藏"某些属性,您可以简单地执行像这样:
attributes = list(object.__dict__.keys()) + list(obj.__slots__) + list(type(obj).__dict__)
(使用适当的错误检查!)以获取默认值的dir()
输出。
也就是说,如果您对特定库感兴趣,那么可能有一些特定于该库的方法可以可靠地工作。
import pprint from pprint
pprint (vars(<object name>))