2017-09-27 2 views
0

Ich habe eine Klasse:Python statisches Klassenmitglied: Zugriff über Instanz

class A: 
    x = 12 

Was ist der Unterschied zwischen diesen beiden Zugangsformen zum statischen Mitglied ist ?:

a = A() 
print(a.x) # >> 12 
print(a.__class__.x) # >> 12 
+0

In dieser Situation keine, aber Sie können den Klassennamensraum mit Zuweisung direkt auf eine Instanz überschatten. –

Antwort

2

Es gibt keinen Unterschied, wenn den Wert erhalten; a.x wird auf A.x (das ist das gleiche wie a.__class__.x) fallen. Wenn Sie jedoch versuchen, einen Wert festzulegen, setzt a.x = 13 eine neue Instanzvariable, wobei A.x mit dem ursprünglichen Wert belassen wird. Von nun an wird a.x immer den Instanzwert nicht die Klasse eins finden.

1

Es gibt keinen Unterschied, sie sind gleich. Dies hängt damit zusammen, wie Python seine Attribute sucht.

Es sieht zunächst die Instanz Attribute, wenn sie nicht finden, dass es sich in den Klasse Attributen aussehen, und so weiter.

In der zweiten Anweisung (a.__class__.x) sagt Ihnen explicity, dass Python direkt in der Klasse dict aussehen soll, wobei die Instanzsuche übersprungen wird.

1

Hier gibt a.x den Variablenwert der Instanz der Klasse zurück (der Bereich ist auf das Klassenobjekt beschränkt), während A.x den Wert der Klassenvariablen zurückgibt. Sie können überprüfen, es mag:

# create object of class A() 
>>> a = A() 
>>> b = A() 

# same value 
>>> A.x 
12 
>>> a.x 
12 

# updated a.x 
>>> a.x = 5 
>>> A.x # still old value 
12 
>>> a.x # new value 
5 
>>> b.x # old value 
12 

# updated A.x 
>>> A.x = 9 # new value 
>>> A.x 
9 
>>> a.x # old value 
5 
>>> b.x # new value 
9 

Fazit: Wenn Sie den Wert der Instanz der Klasse aktualisieren, wird die Änderung auf diese Instanz beschränkt werden. Wenn Sie jedoch den Wert der Klassenvariablen ändern, wird die Änderung für alle Instanzen übernommen, wenn die Instanz den Wert nicht explizit überschrieben hat.

Verwandte Themen