2017-10-11 6 views
0

Parfois, j'ai besoin de modifier le comportement de la méthode existante ou d'injecter des méta-données pour tester les purpouses. Comme: nous avons 2 classes prédéfinies que nous ne pouvons pas changer (nous pouvons implémenter SomeClass * juste pour faciliter l'injection de métadonnées). Alors, que faut-il faire pour imprimer des identifiants incrémentés (comme: 1 2 3)?Comment injecter des métadonnées dans un objet existant

print A().id, B().id, A().id 

Répondre

0

Il se trouve que je devrais créer métaclasse avec méthode __call__ et des classes avec mon métaclasse Réinitialiser comme dans l'exemple ci-dessous:

collector = 0 


class IdMeta(type): 
    def __call__(cls, *args, **kwds): 
     global collector 
     collector += 1 
     cls.id = collector 
     return type.__call__(cls, *args, **kwds) 


A = IdMeta(A.__name__, A.__bases__, dict(A.__dict__)) 
B = IdMeta(B.__name__, B.__bases__, dict(B.__dict__))