Как я могу получить список всех классов, которые я импортирую из модуля в Python 3?

#python

#python

Вопрос:

Я хочу создать список, состоящий из имен всех классов, которые я импортирую из определенной папки.

На данный момент у меня есть что-то вроде этого:

 from .my_classes import Class1, Class2, Class3
list_of_classes = [Class1.__name__, Class2.__name__, Class3.__name__]
 

Но я хочу преобразовать его во что-то менее ручное:

 from .my_classes import *

# .my_classes is obviously not working
list_of_classes = [cls.__name__ for cls in .my_classes]
 

Как я могу получить .my_classes в виде списка?

.my_classes есть ли папка с такой структурой:

 my_classes
|
|--__init__.py
|--some_classes_here.py
|--some_more_classes_here.py
 

Комментарии:

1. Возможно, вы могли бы начать с имен классов и программно импортировать их.

2. Может быть, вы можете просто import my_classes ?

3. Для чего вам нужен список имен?

Ответ №1:

В основном импортированные объекты становятся атрибутами вашего модуля. Таким образом, вызов vars() установит все параметры.

Если вы поместите его после импорта, вы должны его увидеть.

Пожалуйста, обратите внимание, что при импорте import x as y вы увидите y , а не x

пример:

 import collections
import re
print([x for x in vars() if  not (x.startswith('__') and x.endswith('__'))])
['collections', 're']
 

Ответ №2:

Вы можете использовать locals() для сбора имен в вашем текущем пространстве имен, а затем проверить, из какого модуля они были получены, используя __module__ атрибут. Это работает только для классов и функций.

 from .my_classes import *

classes = []
for name, item in locals().copy().items():
    try:
        if item.__module__ == 'my_classes':
            classes.append(item.__name__)
    except AttributeError:
        continue

classes
# returns:
['Class1', 'Class2', 'Class3']