如何获取Python模块中的所有对象?
我需要获取一个模块中所有对象的列表,而不仅仅是它们的名字。比如,我有:
class myClass:
def __init__(self):
# here be code
pass
class thing1(myClass):
def __init__(self):
self.x = 1
class thing2(myClass):
def __init__(self):
self.x = 2
等等。
我想要的是能够给我一个列表,里面包含myClass
中的对象(比如thing1
、thing2
),这样我就可以调用它们的方法或者获取它们的属性。我想做的事情大概是这样的:
for myThing in dir(myClass):
print myThing.x
但是dir
这个函数只给我类的名字列表,我无法从中获取属性。
那我该怎么做呢?
6 个回答
我觉得 locals()
会给你一个字典,这个字典里包含了所有的局部变量和它们指向的对象。
你也可以试试使用 eval()
或 exec()
这两个函数,把名字当成原始的 Python 代码来执行。这样你就可以直接使用 dir()
的结果了。
如果你想查看一个类、实例或模块的成员,可以直接用内置的 vars()
函数:http://docs.python.org/library/functions.html#vars(它的功能是如实所说的)。
如果你想在一个函数或类内部查看当前模块的成员(这时 vars()
可能会出错),那么你应该使用 globals()
。
不过,你的问题中的代码和描述不太一致。你 说 你想访问 myClass
内部的对象,但你提供的代码似乎是在寻找 myClass
的子类,而不是它的内容。
为了补充 Asterisk 的回答,这里有一些在交互式提示符下玩这个的例子:
>>> class Example:
... def method(): pass
...
>>> class SubExample(Example):
... pass
...
>>> class OverrideExample(Example):
... def method():
... pass
...
>>> globals()
{'OverrideExample': <class '__main__.OverrideExample'>, '__builtins__': <module
'builtins' (built-in)>, 'Example': <class '__main__.Example'>, '__name__': '__ma
in__', '__package__': None, '__doc__': None, 'SubExample': <class '__main__.SubE
xample'>}
>>> Example.__subclasses__()
[<class '__main__.SubExample'>, <class '__main__.OverrideExample'>]
>>> vars(Example)
dict_proxy({'__dict__': <attribute '__dict__' of 'Example' objects>, '__module__
': '__main__', '__weakref__': <attribute '__weakref__' of 'Example' objects>, 'm
ethod': <function method at 0x00BF6F18>, '__doc__': None})
>>> vars(SubExample)
dict_proxy({'__module__': '__main__', '__doc__': None})
>>> vars(OverrideExample)
dict_proxy({'__module__': '__main__', 'method': <function method at 0x00C10030>,
'__doc__': None})
>>> vars(Example())
{}
>>> vars(SubExample())
{}
>>> vars(OverrideExample())
{}
注意在模块级别、每个类对象和每个类实例中可见的内容之间的区别。
还要注意,对于给定的类定义,vars()
不会告诉你任何继承的方法。它也不会告诉你通过类实例可以访问的方法。要正确查看这两者,最好的办法是按照 Noufal 的建议,使用 dir()
,并对每个属性调用 getattr()
。
如果你有一个属性的名字,并且这个名字是以字符串的形式存在的,你可以用 getattr
来获取这个属性。
假设你有一个模块 X,你可以用下面的方式来获取它所有属性的列表,以及(比如说)这些属性的类型。
for i in dir(X):
print (i," ",type(getattr(X,i)))