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