如何在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 函数只给出了类名列表,我无法从中获取属性。

我怎样才能做到这一点?

原文由 NSP 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果字符串中有属性名称,则应使用 getattr 将其取出。

给定一个模块 X,你可以得到它所有属性的列表和(例如)它们的类型,就像这样。

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

原文由 Noufal Ibrahim 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你真的想要一个类、实例或模块的 _成员_,只需使用 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()

原文由 ncoghlan 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题