Как получить все экземпляры класса в текущем модуле - PullRequest
3 голосов
/ 04 июля 2011

У меня есть модуль foo, который определяет класс Foo и создает несколько экземпляров этого класса.

Из других модулей я могу import foo и получить список объектов Foo, экземпляры которых:

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)]

Было бы удобно, если бы я мог сделать это из модуля foo. Но, как написано, имя foo не имеет смысла внутри foo, и изменение на self не помогает.

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

1 Ответ

8 голосов
/ 04 июля 2011

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 или в другие модули.

Если вы на самом деле пытаетесь получить все экземпляры чего-либо, созданного в модуле, это, однако, признак серьезной проблемы с кодированием; возможно, стоит написать в этом модуле фабричную функцию-оболочку, которая ничего не делает, кроме как передает аргументы инициализации и возвращает результат, отслеживая инициализированные объекты.

...