Вы можете сделать 'регистрацию' диктовкой, на которую подписаны все новые экземпляры, с отображением ID-> объектов:
registry = {}
class MyClass(object):
def __init__(self, ...):
id = ...
registry[id] = self
MyClass.__all__ = registry
Это эквивалентно другому принятому решению (другое, однако, более «питонное»). Ранее я улучшил этот метод двумя способами: 1) вы можете создать собственный класс контейнера для реестра, который позволяет выполнять поиск не только по идентификаторам; 2) вы также можете создать метакласс, который автоматически добавляет код, но это может стать уродливым, если вам нужны метаклассы для чего-то другого.
изменить: поскольку другой ответ был приемлем, добавлены способы вычеркнуть шаблон проектирования