2016-12-02 3 views
1

ich irgendwo gelesen, dass „wenn Python nicht Instanz-Variable finden kann, wird es versuchen Wert der Klassenvariablen zurück mit dem gleichen Namen“Klasse Variable haben unterschiedliche Werte für verschiedene Instanzen

zB

class Sample: 
    pi = 10 

Jetzt

x1 = Sample() 
x2 = Sample() 

x1.pi   # returns 10 
x2.pi   # returns 10 

x1.pi = 20 # change the value of class variable 
x1.pi   # return 20 (OK) 
x2.pi   # still returns 10 :(
Sample.pi  # returns 10 :(

Was passiert ??

+4

'pi' ist nicht einmal in Ihrer Klasse definiert – lmiguelvargasf

+0

Sorry über den Tippfehler @lmiguelvargasf, ich habe den Beitrag bearbeitet –

Antwort

2

Sobald Sie einem Namen für eine Instanz zuweisen, erhält er ein Instanzattribut, das das Klassenattribut schattiert.

Die einzige Möglichkeit, die Sie dem Klassenattribut zuweisen können, besteht darin, einem Attribut der Klasse, nicht einem Attribut der Instanz, z. wenn Sie eine Instanz haben, müssen Sie tun:

x1.__class__.pi = 20 
# If you're on Py3, or on Py2 and x1 is an instance of a new-style class, 
# using type(x1) is slightly "nicer" than manually accessing dunder special 
# variables, but unfortunately, it doesn't work on old-style class instances 
# For new-style class instances though, the following is equivalent: 
type(x1).pi = 20 

, wenn Sie alle Instanzen des gleichen Typs wie x1 wollen die Veränderung zeigen. Dies erhält die Klasse selbst von __class__ (oder über type Funktion), dann wird sie zugewiesen.

Wenn Sie versehentlich eine Instanz erstellt Attribut und wollen wieder das Klassenattribut belichten, können Sie tun:

del x1.pi 

das gelingen wird, wenn eine Instanz pi genannte Attribut vorhanden ist, und raise AttributeError wenn es nicht (es tut löscht das Klassenattribut nicht, wenn es existiert, müsstest du dazu del x1.__class__.pi/del type(x1).pi tun.

+0

Hinweis: Diese Antwort geht davon aus, dass das Klassenattribut wirklich' Pi' genannt wird; Ihr Beispiel nennt es 'x' und greift dann auf' pi' zu. – ShadowRanger

Verwandte Themen