打印对象的所有不可迭代属性



正如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>))

最新更新