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

2024-09-28 22:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设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__这样的东西会在这里返回,即使我让它工作。


Tags: 对象方法字符串in列表forifdir
3条回答

您可以通过__dict__属性或built-in ^{}函数获得它,这只是一个快捷方式:

>>> 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()

基本的答案是“你不能这么可靠”。见this question

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

但是,你不应该依赖这个,because

Because dir() is supplied primarily as a convenience for use at an interactive prompt, it tries to supply an interesting set of names more than it tries to supply a rigorously or consistently defined set of names, and its detailed behavior may change across releases.

换句话说,没有一种规范的方法可以得到“对象的所有属性”(或“对象的所有方法”)的列表。

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

相关问题 更多 >