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

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

Danke :-) habs verstanden
Antworten