goal: "import foo
и получить список объектов Foo, созданных с помощью ... "
Тебе вообще не нужен самоанализ. Представьте, что это ваш класс:
class Registered(object):
_all = set()
def __init__(self):
self.__class__._all.add(self)
Демонстрация; создать экземпляр группы объектов и обратиться к ним:
>>> Registered()
>>> Registered()
>>> Registered()
>>> Registered._all
{<__main__.Registered object at 0xcd3210>, <__main__.Registered object at 0xcd3150>, <__main__.Registered object at 0xcd31d0>}
Поскольку вы используете dir
, если я вас правильно понимаю, вы пытаетесь найти все объекты в глобальных переменных текущего модуля. Однако он не дает вам все объекты в текущем модуле, только те, которые связаны с переменными. Если это то, что вы действительно хотите, вы можете сделать {var for name,var in globals() if isinstance(var,Foo)}
Если это не то, что вам действительно нужно, вы можете изменить вышеприведенное, чтобы отслеживать модуль, в котором объект был определен через inspect.currentframe().f_back.f_globals
или что-то еще, но это помешает вам использовать фабричные функции, определенные в foo.py
или в другие модули.
Если вы на самом деле пытаетесь получить все экземпляры чего-либо, созданного в модуле, это, однако, признак серьезной проблемы с кодированием; возможно, стоит написать в этом модуле фабричную функцию-оболочку, которая ничего не делает, кроме как передает аргументы инициализации и возвращает результат, отслеживая инициализированные объекты.