Общий метакласс для отслеживания подклассов?

Я пытаюсь написать общий метакласс для отслеживания подклассов

Поскольку я хочу, чтобы это было универсальным, я не хотел жестко кодировать никакое имя класса в этом метаклассе, поэтому я придумал функцию, которая генерирует правильный метакласс, что-то вроде:

def make_subtracker(root):
    class SubclassTracker(type):
        def __init__(cls, name, bases, dct):
            print('registering %s' % (name,))
            root._registry.append(cls)
            super(SubclassTracker, cls).__init__(name, bases, dct)
    return SubclassTracker

Таким образом, я мог бы вызвать его для создания метакласса для конкретногокорень класс с:

__metaclass__ = make_subtracker(Root)

Здесь я сталкиваюсь с проблемой. Я не могу сделать это:

class Root(object):
   _registry = []
   __metaclass__ = make_subtracker(Root)

...так какRoot еще не определено, когда я используюmake_subtracker(Root), Я пытался добавитьметаклассом атрибут позже, так что, по крайней мере, его можно применять в подклассах:

class Root(object):
   _registry = []

Root.__metaclass__ = make_subtracker(Root)

... но это не работает.метаклассом имеет специальную обработку при чтении определения класса, как определено вhttp://docs.python.org/reference/datamodel.html#customizing-class-creation

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

Ответы на вопрос(3)

Ваш ответ на вопрос