我正在尝试使用dir
和getattr
的组合以编程方式访问某些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)“有趣的一组名字”是什么意思,它是如何计算的?
答案 0 :(得分:0)
使用自定义__getattr__
和__getattribute__
实现,对象可以动态响应任何属性的请求。您可以拥有一个具有每个属性的对象,或者一个随机拥有或不具有foo
属性的对象,每次查看时都有50%的概率。如果您知道对象的__getattr__
和__getattribute__
是如何工作的,并且您知道它们响应了有限的属性名称列表,那么您可以编写自己的dir
版本列出所有内容,但即使处理基本的内置类型也需要一些不舒服的案例。您可以在Objects/object.c
中看到dir
实施。
该文档解释了哪些属性被认为是有趣的:
通过“属性”,此文档主要是指其__dict__
的键。 __members__
和__methods__
也有一些处理方式;那些被弃用了,我不记得他们做了什么。