В случае, если это поможет кому-то еще.Вот окончательное решение, которое я использовал.Этот метод возвращает все классы, определенные в определенном пакете.
Я храню все подклассы X в определенной папке (пакете), а затем, используя этот метод, могу загрузить все подклассы X, даже если они еще не были импортированы.(Если они еще не были импортированы, они не могут быть доступны через __all__
; в противном случае все было бы намного проще).
import importlib, os, inspect
def get_modules_in_package(package_name: str):
files = os.listdir(package_name)
for file in files:
if file not in ['__init__.py', '__pycache__']:
if file[-3:] != '.py':
continue
file_name = file[:-3]
module_name = package_name + '.' + file_name
for name, cls in inspect.getmembers(importlib.import_module(module_name), inspect.isclass):
if cls.__module__ == module_name:
yield cls