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

NSP*_*NSP 14 python module

我需要获取模块中所有对象的列表 - 而不是仅列出其名称的列表.所以,例如,我有:

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
Run Code Online (Sandbox Code Playgroud)

等等.

我想要的是能给我一个myClass(thing1,thing2)中的对象列表的东西,我可以从中调用方法/获取属性.我正在尝试做这样的事情:

for myThing in dir(myClass):  
    print myThing.x
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

Nou*_*him 20

如果您在字符串中有属性的名称,则应该使用getattr它来获取它.

给定一个模块X,你可以得到它所有属性的列表,以及(例如)它们的类型.

for i in dir(X):
   print i,"  ",type(getattr(X,i))
Run Code Online (Sandbox Code Playgroud)


nco*_*lan 7

如果你真的想要一个类,实例或模块的成员,只需使用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())
{}
Run Code Online (Sandbox Code Playgroud)

请注意模块级别,每个类对象和每个类实例上可见的内容之间的差异.

另请注意,对于给定的类定义,vars() 不会告诉您任何继承的方法.它也不会告诉您通过类实例可用的方法.要正确地看到这两者,你最好的办法就是按照Noufal的建议行走dir(),呼唤getattr()每个属性.