2017-10-11 1 views
0

Manchmal muss ich das Verhalten der vorhandenen Methoden ändern oder Metadaten zum Testen von Purpos einfügen. Zum Beispiel: Wir haben 2 vordefinierte Klassen, die wir nicht ändern können (wir können SomeClass * implementieren, um das Einfügen von Metadaten zu erleichtern).Wie man Metadaten in existierende Objekte injiziert

class A(SomeClass1): 
    def __init__(self): 
     last_id = self.id 

class B(SomeClass2): 
    def __init__(self): 
     last_id = self.id 

Also was sollte getan werden, um nächste Zeile drucken inkrementierte IDs (wie: 1 2 3)?

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

Antwort

0

Es stellt sich heraus, dass ich metaclass mit __call__ Methode und neu initialisieren Klassen mit meinem metaclass wie in Beispiel unten schaffen sollte:

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__)) 
Verwandte Themen