使用dir和getattr严格迭代对象的属性

时间:2015-06-23 19:42:04

标签: python-3.x

我正在尝试使用dirgetattr的组合以编程方式访问某些Python3对象的所有字段。下面的伪代码:

x = some_object()
for i in dir(x):
    print(str(getattr(x, i)))

然而,dir上的Python文档(https://docs.python.org/2/library/functions.html#dir)非常模糊:

  

注意因为dir()主要是为了方便在交互式提示中使用而提供的,所以它尝试提供一组有趣的名称而不是尝试提供严格或一致定义的名称集,并且其详细行为可能跨版本更改。

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

1 个答案:

答案 0 :(得分:0)

  1. 有点?
  2. 使用自定义__getattr____getattribute__实现,对象可以动态响应任何属性的请求。您可以拥有一个具有每个属性的对象,或者一个随机拥有或不具有foo属性的对象,每次查看时都有50%的概率。如果您知道对象的__getattr____getattribute__是如何工作的,并且您知道它们响应了有限的属性名称列表,那么您可以编写自己的dir版本列出所有内容,但即使处理基本的内置类型也需要一些不舒服的案例。您可以在Objects/object.c中看到dir实施。

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

      • 如果对象是模块对象,则列表包含模块属性的名称。
      • 如果对象是类型或类对象,则列表包含其属性的名称,并递归地显示其基础的属性。
      • 否则,该列表包含对象的属性名称,其类的属性名称,以及其类的基类的属性的递归。
    2. 通过“属性”,此文档主要是指其__dict__的键。 __members____methods__也有一些处理方式;那些被弃用了,我不记得他们做了什么。