Как получить все объекты в модуле в 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 предоставляет только список имен классов, и я не могу получить от этого атрибут.

Как я могу это сделать?

Ответ 1

Если у вас есть имя атрибута в строке, вы должны использовать getattr для его извлечения.

Учитывая модуль X, вы можете получить список всех его атрибутов и (например) их типов с чем-то вроде этого.

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

Ответ 2

Если вам действительно нужны члены класса, экземпляра или модуля, просто используйте vars() builtin: 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() не расскажет вам о каких-либо унаследованных методах. Он также не расскажет вам о методах, доступных через экземпляр класса. Чтобы правильно видеть обоих, лучше всего делать то, что предлагает Нуфал, и ходить dir(), вызывая getattr() для каждого атрибута.

Ответ 3

Я верю, что locals() дает вам словарь всех локальных переменных и объектов, на которые они указывают.

Вы также можете попробовать использовать функции eval() или exec() для оценки имен в качестве исходного кода на языке python. Затем вы можете напрямую использовать результаты из dir().

Ответ 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'>]

Ответ 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>)