sto cercando di scrivere un metaclasse generico per il monitoraggio sottoclassiPython generico metaclasse per tenere traccia delle sottoclassi
Dal momento che voglio che questo sia generica, non ho voglia di codificare qualsiasi nome di classe all'interno di questa metaclasse, quindi, mi si avvicinò con una funzione che genera il corretto metaclasse, qualcosa di simile:
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
questo modo ho potuto invocare per generare un metaclasse per una specifica radice classe con:
__metaclass__ = make_subtracker(Root)
Ecco dove mi imbatto in un problema. Non posso fare questo:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
... perché Root
non è ancora definita quando uso make_subtracker(Root)
. Ho provato ad aggiungere la metaclasse attributo successivamente, in modo che almeno può essere applicato in sottoclassi:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
... ma questo non funziona. metaclasse ha un trattamento speciale quando la definizione della classe viene letta, come definito nella http://docs.python.org/reference/datamodel.html#customizing-class-creation
Sto cercando suggerimenti per fare questo (o cambiare un metaclasse di classe in fase di esecuzione in un modo che si applica a le sue sottoclassi o qualsiasi altra alternativa).
Si prega di non farlo. La gente che viene dopo te la strapperà perché è troppo complessa. Utilizzare una funzione di fabbrica che crei oggetti della sottoclasse appropriata. –