Eine Verständnisfrage zur OOP (Klassenattribute)

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.
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Eine Verständnisfrage zur OOP (Klassenattribute)

Beitragvon alan » Samstag 25. August 2007, 18:07

Hallo,

arbeite mich gerade durch Dive Into Python durch, und bin da in Kapitel 5.8 (Introducing class attributes) hängen geblieben:

Code: Alles auswählen

class counter:
   count = 0
   def __init__(self):
      self.__class__.count += 1

>>> c = counter()
>>> d = counter()
>>> c.count
2
>>> counter.count
2
>>> c.count = 13
>>> d.count
2 # Wieso nicht 13?
>>> counter.count
2
>>> e = counter()
>>> c.count
13


Was ich nicht verstehe:
Dive Into Python schreibt "notice how the class attribute is shared by the class and all instances of the class".

Wieso ändert sich dieses Verhalten, sobald ich von außerhalb das Klassenattribut ändere (c.count=13)?

Bis dahin schien es so, als ob counter.count, c.count und e.count nur unterschiedliche Namen für das selbe Objekt wären (bzw. so habe ich mir Klassenattribute vorgestellt), aber das stimmt offensichtlich nicht?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Eine Verständnisfrage zur OOP (Klassenattribute)

Beitragvon Leonidas » Samstag 25. August 2007, 19:32

alan hat geschrieben:Wieso ändert sich dieses Verhalten, sobald ich von außerhalb das Klassenattribut ändere (c.count=13)?

Weil du das Klassenattribut mit einem Instanzattribut überschreibst, welches per ``self.counter`` innerhalb der Klasse zu erreichen ist.

Wundert dich dieses Verhalten:

Code: Alles auswählen

class Counter(object): pass
c = Counter()
c.count = 42
print c.counter

Nein, oder? Siehst du, das ist bewirkt das gleiche - ein Attribut wird an eine Klasseninstanz gehängt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Beitragvon alan » Samstag 25. August 2007, 23:57

Danke :-) habs verstanden

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]