假设 o是一个 Python 对象,我需要 o的所有字段,不需要任何方法或者 __stuff__。这怎么可能呢?
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__这样的东西会被返回到这里,即使我让这个工作。
dir(o)
dir
__class__
这应该适用于可调用性:
[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函数得到它,这只是一个快捷方式:
__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()
vars()
基本的答案是“你不能这样做可靠”。参见 这个问题。
你可以得到 [attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))]的近似值。
[attr for attr in dir(obj) if attr[:2] + attr[-2:] != '____' and not callable(getattr(obj,attr))]
然而,你不应该依赖这个,因为:
因为提供 dir()主要是为了便于在交互式提示符中使用,所以它尝试提供一组有趣的名称,而不是尝试提供一组严格或一致定义的名称,并且它的详细行为可能在不同版本之间发生变化。
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']。
['foo', 'bar']