Pythonenklassenattribut

Ich habe eine Frage über Klassenattribut in Python.

class base : def __init__ (self): pass derived_val = 1 t1 = base() t2 = base () t2.derived_val +=1 t2.__class__.derived_val +=2 print t2.derived_val # its value is 2 print t2.__class__.derived_val # its value is 3 

Die Ergebnisse sind unterschiedlich. Ich benutze auch id () – Funktion, um t2.derived_val und t2 zu finden. Class.derived_val haben unterschiedliche Speicheradresse. Mein Problem ist abgeleitet_val ist Klassenattribut. Warum ist es im obigen Beispiel anders? Ist es, weil die Instanz der Klasse kopiert seine eigenen abgeleiteten_val neben dem Klassenattribut?

3 Solutions collect form web for “Pythonenklassenattribut”

Es gibt Klassenattribute und Instanzattribute. Wenn du sagst

 class base : derived_val = 1 

Sie definieren ein Klassenattribut. derived_val wird ein Schlüssel in base.__dict__ .

 t2=base() print(base.__dict__) # {'derived_val': 1, '__module__': '__main__', '__doc__': None} print(t2.__dict__) # {} 

Wenn du sagst t2.derived_val Python versucht, 'derived_val' in t2.__dict__ . Da es nicht da ist, sieht es aus, wenn es einen 'derived_val' Schlüssel in einer der Basisklassen von t2 gibt.

 print(t2.derived_val) print(t2.__dict__) # 1 # {} 

Aber wenn du t2.derived_val einen Wert t2.derived_val , t2.derived_val du nun ein t2.derived_val zu t2 . Ein derived_val Schlüssel wird zu t2.__dict__ .

 t2.derived_val = t2.derived_val+1 print(t2.derived_val) print(t2.__dict__) # 2 # {'derived_val': 2} 

Beachten Sie, dass es an diesem Punkt zwei derived_val Attribute gibt, aber nur das derived_val ist leicht zugänglich. Das Klassenattribut wird nur durch Verweis auf base.derived_val oder direkten Zugriff auf die Klasse dict base.__dict__ .

Check it out hier und hier .

Das Attribut __class__ ist die Klasse, zu der das Objekt gehört. Also in Ihrem Beispiel ist die Situation ähnlich wie statische Variablen. Die t2.__class__.derived_val bezieht sich auf die Variable, die zur Klasse gehört, nicht die Variable, die zu t2 gehört.

Ein anderer Weg (vielleicht ein prägnanterer), um das zu demonstrieren:

 class A(): a1 = [] x = A() y = A() x.a1.append("test") x.a1, y.a1 (['test'], ['test']) class B(): b1 = None def __init__(self): self.b1 = list() r = B() s = B() r.b1.append("test") r.b1, s.b1 (["test"], []) 
Python ist die beste Programmiersprache der Welt.