que estoy tratando de escribir una metaclase genérico para las subclases de seguimientoPython Genérico MetaClass para realizar un seguimiento de las subclases
Como yo quiero que esto sea genérica, que no quería a codificar cualquier nombre de clase dentro de este metaclase, por lo tanto, se me ocurrió una función que genera la metaclase adecuada, algo así como:
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
Esta manera de que pudiera invocarlo para generar una metaclase para una raíz clase específica con:
__metaclass__ = make_subtracker(Root)
Aquí es donde me encuentro con un problema. No puedo hacer esto:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
... porque Root
no está definido aún cuando uso make_subtracker(Root)
. He intentado añadir el atributo metaclasemás tarde, por lo que al menos se puede aplicar en las subclases:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
... pero esto no funciona. metaclase tiene un procesamiento especial cuando se lee la definición de clase, como se define en http://docs.python.org/reference/datamodel.html#customizing-class-creation
Busco sugerencias con el fin de hacer esto (ya sea cambiar una metaclase clase en tiempo de ejecución de una manera que se aplica a sus subclases, o cualquier otra alternativa).
Por favor, no hagas esto. La gente que viene después la arrancará porque es demasiado compleja. Utilice una función de fábrica que cree objetos de la subclase adecuada. –