如何获取Python模块中的所有对象?

25 投票
6 回答
33946 浏览
提问于 2025-04-16 14:58

我需要获取一个模块中所有对象的列表,而不仅仅是它们的名字。比如,我有:

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中的对象(比如thing1thing2),这样我就可以调用它们的方法或者获取它们的属性。我想做的事情大概是这样的:

for myThing in dir(myClass):  
    print myThing.x

但是dir这个函数只给我类的名字列表,我无法从中获取属性。

那我该怎么做呢?

6 个回答

2

我觉得 locals() 会给你一个字典,这个字典里包含了所有的局部变量和它们指向的对象。

你也可以试试使用 eval()exec() 这两个函数,把名字当成原始的 Python 代码来执行。这样你就可以直接使用 dir() 的结果了。

9

如果你想查看一个类、实例或模块的成员,可以直接用内置的 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()

30

如果你有一个属性的名字,并且这个名字是以字符串的形式存在的,你可以用 getattr 来获取这个属性。

假设你有一个模块 X,你可以用下面的方式来获取它所有属性的列表,以及(比如说)这些属性的类型。

for i in dir(X):
   print (i,"  ",type(getattr(X,i)))

撰写回答