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

2024-10-01 09:26:20 发布

您现在位置: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

等等。

我想要的是给我一个myClassthing1thing2)中的对象列表,从中我可以调用方法/获取属性。我想做这样的事:

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

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

我该怎么做?


Tags: 模块对象self名称列表属性hereinit
3条回答

我相信locals()为您提供了一个包含所有局部变量及其指向的对象的字典。

您还可以尝试使用eval()exec()函数将名称计算为原始python代码。然后可以直接使用dir()的结果。

如果您真的想要类、实例或模块的成员,只需使用vars()内置:http://docs.python.org/library/functions.html#vars(它可以像广告中那样工作)

如果您希望当前模块的成员来自函数或类(其中vars()将做错误的事情),那么应该改用globals()

但是,问题中的代码和单词不匹配。你说你想访问“myClass”中的对象,但是你发布的代码显然是在寻找myClass的子类,而不是它的内容。

为了补充星号的答案,在交互式提示下使用此选项的更多示例:

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

相关问题 更多 >