2016-03-19 19 views
-2

Ich habe einige Python üben. Ich habe eine Klasse erstellt und dann Instanzen dieser Klasse erstellt.Bereits erstellte Instanz der Klasse wird aktualisiert von setattr() python classmethod

Wenn ich der Klasse eine Klassenmethode hinzufüge, die die Klasse selbst mit einem neuen Attribut durch setattr() aktualisiert, erhalten die bereits instanziierten Objekte den neuen Wert. Ich bin ziemlich überrascht, wie die "älteren" Instanzen das neue Attribut erhalten, wenn sie bereits instanziiert wurden.

mir meinen Code Lassen Sie zeigen ...

class Me: 
    x=10 
    def __init__(self,y): 
     self.y=y 
    def mem(self): 
     return self.y 
    def __call__(self): 
     print ("I was Called") 
    @classmethod 
    def addnewprop(cls): 
     newproperty=4 
     setattr(cls,"new",newproperty) 

die Operationen sind wie folgt,

>>>x=Me(9) 
>>>y=Me(8) 
>>>hasattr(x,"new") 
>>>False 
>>>Me.addnewprop() 
>>>hasattr(x,"new") 
    True 
>>> 

Aufruf Me.addnewprop() macht auch die oben genannten Aufgaben die neue Eigenschaft dh erhalten (hasattr (x, "neu") gibt zurück true obwohl bereits instanziiert, warum verhält sich python so? Ich erwartete, dass die bereits definierten obj Ects behalten ihre Eigenschaften und nur neue erhalten die neue Eigenschaft.

Antwort

0

Ihre classmethod ist eine Methode für die Klasse Me, und so arbeitet sie auf der Ebene der Klasse eher als eine einzelne Instanz der Klasse. Herkömmlicherweise ist der an Klassenmethoden übergebene Parameter cls, nicht selbst, um Programmierer an diese Tatsache zu erinnern. Also in Ihrem Fall ist die Selbst in Ihrer Klassenmethode die Klasse Ich, keine Instanz, und das geänderte Attribut wird auf jede vorhandene Instanz der Klasse angewendet (und alle, die Sie in der Zukunft erstellen).

Wenn Sie die Änderung an einer einzelnen Instanz vornehmen möchten, verwenden Sie einfach eine Standardmethode.