Generische Metaklasse, um Unterklassen im Auge zu behalten?

Ich versuche, eine generische Metaklasse zum Verfolgen von Unterklassen zu schreiben.

Da ich möchte, dass dies generisch ist, wollte ich keinen Klassennamen in dieser Metaklasse fest codieren. Daher habe ich eine Funktion entwickelt, die die richtige Metaklasse generiert, etwa:

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

uf diese Weise könnte ich es aufrufen, um eine Metaklasse für ein bestimmtes @ zu generiereWurze Klasse mit:

__metaclass__ = make_subtracker(Root)

Hier stoße ich auf ein Problem. Ich kann das nicht tun

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

...weilRoot ist noch nicht definiert, wenn ich @ benutmake_subtracker(Root). Ich habe versucht, das @ hinzuzufüg metaclass -Attribut später, damit es zumindest in Unterklassen angewendet werden kann:

class Root(object):
   _registry = []

Root.__metaclass__ = make_subtracker(Root)

... aber das geht nicht. metaclass hat eine spezielle Verarbeitung, wenn die Klassendefinition gelesen wird, wie in @ definiehttp: //docs.python.org/reference/datamodel.html#customizing-class-creatio

Ich suche nach Vorschlägen, um dies zu tun (entweder die Metaklasse einer Klasse zur Laufzeit so ändern, dass sie auf ihre Unterklassen angewendet wird, oder eine andere Alternative).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage