Verhalten von Static Member in Klasse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
neweman
User
Beiträge: 7
Registriert: Sonntag 21. November 2010, 20:54

Hallo,
folgendes Verhalten kann ich mir nicht so recht erklären. Wer hat eine Antwort:
Wieso hat die Variable self.StaticVar den Wert 3, wenn man den unten stehenden Code ausführt ?
Meine Erwartung wäre das der Output so aussehen würde:
1
1
2
2

Der tatsächliche Output sieht aber so aus :
1
1
2
3

Code: Alles auswählen

class MyClass:
    StaticVar = 1

    def __init__(self):
        
        print MyClass.StaticVar
        print self.StaticVar
        
        MyClass.StaticVar += 1
        self.StaticVar+=1
        
        print MyClass.StaticVar
        print self.StaticVar
    
test = MyClass()
lunar

Language Reference, Abschnitt 3.1 "Objects, values and Types", Absatz "Class Instances":
A class instance has a namespace implemented as a dictionary which is the first place in which attribute references are searched. When an attribute is not found there, and the instance’s class has an attribute by that name, the search continues with the class attributes. […] Attribute assignments and deletions update the instance’s dictionary, never a class’s dictionary.
Heißt im Klartext: Wird ein bestimmtes Attribut im Namensraums eines Exemplars einer Klasse nicht gefunden, so wird die Suche im Namensraum der Klasse selbst fortgesetzt. Diese Semantik ergibt sich zwangsläufig aus der Voraussetzung, Methoden aus dem Namensraum der Klasse über ein Exemplar derselben erreichen zu können. Eine Zuweisung im Namensraum des Exemplars dagegen ändert nie den Namensraum der Klasse, selbst wenn das Attribut vorher im Namensraum der Klasse gefunden wurde.

"self.StaticVar += 1" ist äquivalent zu "self.StaticVar = self.StaticVar + 1". "self.StaticVar" ist zu diesem Zeitpunkt nicht im Namensraum des Exemplars definiert, wird also dem Namensraum der Klasse entnommen, wo es aufgrund der vorhergehenden Anweisung den Wert 2 hat. Folglich wird also "self.StaticVar = 2 + 1" ausgeführt, und das Ergebnis 3 wird dem Namensraum des Exemplars zugewiesen. Am Ende existiert "StaticVar" also einmal im Namensraum der Klasse mit Wert 2, und einmal im Namensraum des Exemplars mit Wert 3.

So etwas wie "statische Attribute", die Du wohl aus Java kennst, gibt es in Python nicht. In diesem Punkt hat Python eine vollkommen andere Semantik als Java.
neweman
User
Beiträge: 7
Registriert: Sonntag 21. November 2010, 20:54

Super Erklärung - Vielen Dank!
Antworten