【问题标题】:Iterating an object's attributes using dir and getattr rigorously严格使用 dir 和 getattr 迭代对象的属性
【发布时间】:2015-06-23 19:42:04
【问题描述】:

我正在尝试使用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) “有趣的名称集”是什么意思,如何计算?

【问题讨论】:

  • 解决方案可能取决于您为什么需要它。
  • 您想要 Python 2 答案、Python 3 答案,还是两者兼有?我刚刚注意到您标记了 Python 3 问题,但您链接了 Python 2 文档。我的答案是在考虑 Python 2 的情况下编写的;其中一些在 Python 3 中略有不同,主要是代码所在的位置以及需要处理多少已弃用的内容。
  • 抱歉,是的,正在寻找 python3。

标签: python-3.x


【解决方案1】:
  1. 那种?

通过自定义__getattr____getattribute__ 实现,对象可以动态响应对任何属性的请求。您可以拥有一个具有 every 属性的对象,或者一个随机具有或不具有 foo 属性的对象,每次查看的概率为 50%。如果您知道对象的__getattr____getattribute__ 是如何工作的,并且您知道它们响应有限的属性名称列表,那么您可以编写自己的dir 版本来列出所有内容,甚至处理基本的构建-in 类型需要令人不安的案例数量。您可以在Objects/object.c 中看到dir 的实现。

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

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

通过“属性”,本文档主要指的是其__dict__ 的键。 __members____methods__ 也有一些处理;这些已被弃用,我不记得他们做了什么。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2014-09-03
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2010-10-03
    相关资源
    最近更新 更多