Python 3.x 迭代对象';严格使用dir和getattr

Python 3.x 迭代对象';严格使用dir和getattr,python-3.x,Python 3.x,我试图通过组合使用dir和getattr以编程方式访问某个Python3对象的所有字段。伪代码如下: x = some_object() for i in dir(x): print(str(getattr(x, i))) 但是,dir上的Python文档()非常模糊: 注意:由于提供dir()主要是为了方便在交互提示下使用,因此它尝试提供一组有趣的名称,而不是严格或一致定义的名称,并且其详细行为可能会在不同版本中发生变化 我的问题是: 1) 有没有比使用dir更严格地实现上述目标的方

我试图通过组合使用
dir
getattr
以编程方式访问某个Python3对象的所有字段。伪代码如下:

x = some_object()
for i in dir(x):
    print(str(getattr(x, i)))
但是,
dir
上的Python文档()非常模糊:

注意:由于提供dir()主要是为了方便在交互提示下使用,因此它尝试提供一组有趣的名称,而不是严格或一致定义的名称,并且其详细行为可能会在不同版本中发生变化

我的问题是: 1) 有没有比使用dir更严格地实现上述目标的方法? 2) “有趣的名称集”是什么意思?它是如何计算的

  • 有点
  • 使用自定义的
    \uuuuu getattr\uuuuu
    \uuuuu getattribute\uuuuuuuu
    实现,对象可以动态响应对任何属性的请求。您可以拥有一个具有所有属性的对象,或者一个随机具有或不具有
    foo
    属性的对象,每次查看它的概率为50%。如果您知道对象的
    \uuuuu getattr\uuuu
    \uuuuu getattribute\uuuuu
    是如何工作的,并且您知道它们响应于有限的属性名称列表,那么您可以编写自己的
    dir
    版本,列出所有内容,但即使处理基本的内置类型也需要大量的情况。您可以在中看到
    dir
    实现

  • 文档解释了哪些属性被认为是有趣的:

    • 如果对象是模块对象,则列表包含模块属性的名称
    • 如果对象是类型或类对象,则列表包含其属性的名称,并递归地包含其基的属性的名称
    • 否则,该列表将包含对象的属性名称、其类的属性名称以及其类的基类的递归属性名称

  • 通过“属性”,本文档主要是指其
    \uuuu dict\uuuu
    的键。还有一些处理
    \uuuu成员\uuuuu
    \uuu方法\uuuu
    ;这些都已弃用,我不记得它们是做什么的。

    解决方案可能取决于您为什么需要它。您想要Python 2答案、Python 3答案,还是两者都要?我刚刚注意到您标记了问题Python 3,但是您链接了Python 2文档。我的回答是用Python 2编写的;有些在python3中有点不同,主要是代码在哪里以及需要处理多少不推荐的内容。