如何列出一个类的所有字段(没有方法) ?

假设 o是一个 Python 对象,我需要 o的所有字段,不需要任何方法或者 __stuff__。这怎么可能呢?

我试过这样的方法:

[f for f in dir(o) if not callable(f)]


[f for f in dir(o) if not inspect.ismethod(f)]

但是这些返回值与 dir(o)相同,大概是因为 dir给出了一个字符串列表。而且,像 __class__这样的东西会被返回到这里,即使我让这个工作。

105320 次浏览

这应该适用于可调用性:

[f for f in dir(o) if not callable(getattr(o,f))]

你可以用以下方法摆脱剩下的部分:

[f for f in dir(o) if not callable(getattr(o,f)) and not f.startswith('__')]

你可以通过 __dict__属性或者 内置 vars函数得到它,这只是一个快捷方式:

>>> class A(object):
...     foobar = 42
...     def __init__(self):
...         self.foo = 'baz'
...         self.bar = 3
...     def method(self, arg):
...         return True
...
>>> a = A()
>>> a.__dict__
{'foo': 'baz', 'bar': 3}
>>> vars(a)
{'foo': 'baz', 'bar': 3}

只有对象的属性,没有方法和类属性。

您可以使用内置的方法 vars()

基本的答案是“你不能这样做可靠”。参见 这个问题

你可以得到 [attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))]的近似值。

然而,你不应该依赖这个,因为:

因为提供 dir()主要是为了便于在交互式提示符中使用,所以它尝试提供一组有趣的名称,而不是尝试提供一组严格或一致定义的名称,并且它的详细行为可能在不同版本之间发生变化。

换句话说,没有规范的方法来获得“一个对象的所有属性”(或“一个对象的所有方法”)的列表。

如果您正在执行某种动态编程,需要在对象的未知字段上进行迭代,那么唯一可靠的方法是实现您自己的方法来跟踪这些字段。例如,您可以使用一个属性变数命名原则,或者一个特殊的“ fields”对象,或者,最简单的,一个 dictionary。

您可以遍历实例的 __dict__属性并查找非方法内容。 例如:

CALLABLES = types.FunctionType, types.MethodType
for key, value in A().__dict__.items():
if not isinstance(value, CALLABLES):
print(key)

产出:

foo
bar

你可以用一个 列表内涵语句做到这一点:

print([key for key, value in A.__dict__.items() if not isinstance(value, CALLABLES)])

可以打印 ['foo', 'bar']