2017-08-18 1 views
2

Noch wichtiger, wenn jemand die Ausgabe des folgenden Codes erklären kann.Wie behandelt Python einen simultanen Verweis auf eine Variable über self und als Klassenattribut (statisch)?

class myclass: 
    num = 10 
    def mymethod(self): 
    print("PrevValue of self.num->",self.num) 
    print("Prev Value of myclass.num->",myclass.num) 
    self.num+=10 
    myclass.num+=20 
    print("PostValue of self.num->",self.num) 
    print("PostValue of myclass.num->",myclass.num) 

obj1 = myclass() 
obj2 = myclass() 
obj2.mymethod() 
obj1.mymethod() 

Die Ausgabe des obigen Codes ist wie folgt.

('PrevValue of self.num->', 10) 
('Prev Value of myclass.num->', 10) 
('PostValue of self.num->', 20) 
('PostValue of myclass.num->', 30) 
('PrevValue of self.num->', 30) 
('Prev Value of myclass.num->', 30) 
('PostValue of self.num->', 40) 
('PostValue of myclass.num->', 50) 

Die Linie 7, das heißt self.num + = 10 scheint die vermeintliche Klassenattribut num, Bezug zu nehmen und einen Wert, der unter Verwendung selbst hinzufügen. In der nächsten Zeile wird auf dieselbe Variable als Klassenvariable zugegriffen. Es ist also vernünftig anzunehmen, dass die Variable sowohl als statische als auch als selbstvariable Variable verwendet wird. Wie kann eine Variable sowohl statisch als auch selbstvariabel sein? (Oder es ist etwas, das ich hier nicht fehlen könnte)

+0

zu tun, wenn diese hinzugefügt werden sollten nach über den Codezeilen 'print (myclass.num) print (obj2.num) print (obj1.num) ' der Ausgang wäre: '50 40' –

Antwort

3

Das num Attribut beginnt als Klassenattribut aber dann das:

self.num+=10 

kann self.num = self.num + 10 erweitert werden. Was passiert ist: Zuerst suchen wir nach einer Instanzeigenschaft mit dem Namen num, wir finden sie nicht, dann suchen wir nach einer Klasseneigenschaft namens num und verwenden diese, um den Wert der Instanzeigenschaft festzulegen. In diesem Moment haben Sie sowohl eine Instanz als auch eine Klasseneigenschaft mit demselben Namen num.

BEARBEITEN

Die obige Erklärung ist nur teilweise korrekt. Zuerst wird die num Eigenschaft nach einem iadd method gesucht und wenn es das nicht findet (was es tut, weil num ein unveränderlicher Typ ist, wird es versuchen, das Neuzuweisungsverfahren über

+0

Sorry, dass Kerl und nitpick: "kann zu ... erweitert werden" ist im Allgemeinen NICHT wahr. Sie können das überprüfen, indem Sie ein veränderbares Objekt wie eine Liste verwenden. Der Operator '+ =' ruft den inplace add Operator auf, (unerwarteterweise) den statisch Klassenattribut – MariusSiuram

+1

Vielleicht ist der einfachste Weg, um die Antwort richtig zu halten und nicht zu komplizieren Dinge zu addieren "gegeben, dass in diesem Szenario num ist ein unveränderliches Objekt, kann erweitert werden zu ...". Die Umkehrung ist nicht wahr, weil ein veränderbares Objekt die Methode "__iadd__" nicht implementieren kann. Nochmals, Dinge überkomplizieren. – MariusSiuram

+0

tatsächlich, nach einem kurzen Test in Bezug auf diese, wird die Klasseninstanz unmodifizierten –

Verwandte Themen