Je suis en train d'écrire un métaclasse générique pour les sous-classes de suivigénérique Python métaclasse pour garder la trace des sous-classes
Depuis que je veux que ce soit générique, je ne voulais pas coder en dur un nom de classe dans cette métaclasse, donc Je suis venu avec une fonction qui génère la métaclasse appropriée, quelque chose comme:
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
de cette façon, je pouvais l'appeler pour générer un métaclasse pour une classe racine spécifique:
__metaclass__ = make_subtracker(Root)
Voici où je tombe sur un problème. Je ne peux pas le faire:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
... parce que Root
ne définit pas encore quand je l'utilise make_subtracker(Root)
. J'ai essayé d'ajouter le métaclasse attribut plus tard, de sorte qu'au moins il peut être appliqué dans les sous-classes:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
... mais cela ne fonctionne pas. métaclasse a un traitement spécial lorsque la définition de la classe est lu, tel que défini dans http://docs.python.org/reference/datamodel.html#customizing-class-creation
Je cherche des suggestions afin de le faire (soit changer une classe métaclasse lors de l'exécution d'une manière qu'il est appliqué à ses sous-classes, ou toute autre alternative).
Veuillez ne pas faire ceci. Les gens qui viendront après vous l'arracheront parce que c'est trop complexe. Veuillez utiliser une fonction d'usine qui crée des objets de la sous-classe appropriée. –