【问题标题】:How to get all objects in a module in python?如何在python中获取模块中的所有对象?
【发布时间】:2011-04-03 03:38:39
【问题描述】:

我需要获取模块中所有对象的列表——而不是仅列出它们的名称。所以,例如,我有:

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

我该怎么做?

【问题讨论】:

    标签: python module


    【解决方案1】:

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

    给定一个模块 X,您可以通过类似的方式获取其所有属性和(例如)它们的类型的列表。

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

    【讨论】:

      【解决方案2】:

      如果你真的想要一个类、实例或模块的成员,只需使用内置的vars()http://docs.python.org/library/functions.html#vars(它像宣传的那样工作)

      如果您希望 current 模块的成员来自函数或类(其中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()

      【讨论】:

        【解决方案3】:

        我相信locals() 会给你一个包含所有局部变量和它们指向的对象的字典。

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

        【讨论】:

        • 如何使用 eval() 或 exec() 来评估 'myThing'.x?
        【解决方案4】:

        不确定是否有帮助:

        class myClass(object):
        
            def init(self):
                pass
        
        
        class thing1(myClass):
            def init(self):
                self.x = 1
        
        class thing2(myClass):
            def init(self):
                self.x = 2
        
        myClass.__subclasses__()
        [<class '__main__.thing1'>, <class '__main__.thing2'>]
        

        【讨论】:

        • 所以这给了你类,但是你如何从其中一个类中获取 self.x?
        • 发布了另一个答案,希望对您有所帮助。
        【解决方案5】:
        class myClass(object):
        
            def init(self):
                pass
        
        
        class thing1(myClass):
            def __init__(self):
                self.x = 1
        
        class thing2(myClass):
            def __init__(self):
                self.x = 2
        
        print myClass.__subclasses__()
        print vars(thing1())
        print vars(thing2())
        

        [<class '__main__.thing1'>, <class '__main__.thing2'>]
        {'x': 1}
        {'x': 2}
        

        【讨论】:

          【解决方案6】:

          列出模块的一个非常简单的方法是:

          from <module> import *
          print dir(<module>)
          

          【讨论】:

            猜你喜欢
            • 2023-02-03
            • 2018-07-30
            • 2010-12-20
            • 1970-01-01
            • 2020-07-19
            • 1970-01-01
            • 1970-01-01
            • 2021-04-28
            • 2020-12-26
            相关资源
            最近更新 更多