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

时间:2014-02-21 21:00:27

标签: python python-2.7 introspection

假设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__之类的内容将在此处返回,即使我将其付诸实践。

5 个答案:

答案 0 :(得分:47)

您可以通过__dict__属性或built-in 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}

只有对象的属性。方法和类属性不存在。

答案 1 :(得分:8)

基本答案是“你不能可靠地这样做”。请参阅this question

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

但是,您不应该依赖此because

  

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

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

如果您正在进行某种动态编程,需要您迭代对象的unknwon字段,唯一可行的方法是实现自己的方法来跟踪这些字段。例如,您可以使用属性命名约定或特殊的“字段”对象,或者最简单的使用字典。

答案 2 :(得分:5)

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

答案 3 :(得分:5)

您可以遍历实例的__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']

答案 4 :(得分:4)

这适用于callables:

[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('__')]