Am ehesten lassen die sich mit folgendem Code aus „A Byte of Python“ von „Swaroop C H“ (in der deutschen Fassung) erläutern (Gekürzt auf das wichtigste / kompletter Code auf Seite 74/75 des Buchs bzw. 86/87 der PDF):
Code: Alles auswählen
#!/usr/bin/python
class Person:
'''Stellt eine Person dar.'''
bevoelkerung = 0
def __init__(self, name):
'''Initialisiert die Daten der Person.'''
self.name = name
print '(Initialisiere %s)' % self.name
Person.bevoelkerung += 1
def __del__(self):
# gekürzt da nicht wichtig
def sagHallo(self):
'''Begruessung durch die Person.
Das ist wirklich alles, was hier geschieht.'''
print 'Hallo, mein Name ist %s.' % self.name
def wieViele(self):
# gekürzt da nicht wichtig
swaroop = Person('Swaroop')
swaroop.sagHallo()
Daraufhin kommt folgende Ausgabe:
Meine erste Frage bezieht sich auf Klassen- und Objektvariblen.$ python objvar.py
(Initialisiere Swaroop)
Hallo, mein Name ist Swaroop.
# Rest weggekürzt da nicht wichtig
So weit ich das verstehe gibt es hier die Klasse „Person“ mit den Objekten „__init__“, „__del__“, „sagHallo“ und „wieViele“. Ebenso werden die Klassenvariable „bevoelkerung“ und die Objektvariable „self.name“ (im Objekt „__init__“) definiert (sofern definiert das richtige Wort ist).
Mein Problem: Ich verstehe Klassen- und Objektvariablen wie globale und lokale Variablen (die ich schon beim Thema „Funktionen“ kennen gelernt habe). Warum kann dann die Objektvariable „self.name“, die im Objekt „__init__“ definiert wurde, im Objekt „sagHallo“ abgerufen werden? Soweit ich das verstehe (und ich verstehe das mit Sicherheit falsch) dürfte die im Objekt „sagHallo“ nicht mehr gültig sein. Also was bewirkt das die Variable im entsprechenden Objekt trotzdem abgerufen werden kann? Beziehungsweise was ist dann die Definition von Klassenvariable und Objektvariable, wo ist der Unterschied?
Wird durch das „self.“ davor die Variable doch für die ganze Klasse zugänglich, oder sind Objektvariablen generell für alle Objekte zugänglich, oder hat das was mit dem Objekt „__init__ zu tun, das ja sowiso eine „besondere“ bedeutung hat, oder ist der einzige Unterschied zwischen Klassen- und Objektvariablen wo die Variable defininiert wird und wo sie abgerufen wird?
Jetzt die zweite Frage:
In Zeile 25 wird folgender Code angegeben:
Code: Alles auswählen
swaroop = Person('Swaroop')
Mein Problem hier: Ich sehe „swaroop“ in dem Fall als eine einfache (globale) Variable im Hauptblock, die lediglich dazu dient das man später nur „swaroop“ anstatt „Person('Swaroop')“ eingeben muss. Jedoch wird gleich die Klasse „Person“ (und damit auch gleich das dazugehörige Objekt „__init__“) angesprochen. Also wird der Inhalt der Variable gleich ausgeführt. Das halte ich für merkwürdig. Wenns wirklich eine Variable ist, ist das generell so? Und wenns keine einfache (globale) Variable ist, was ist das dann?(Initialisiere Swaroop)
Ganz zu schweigen davon, wenns wirklich so ist wie ich glaube (normale, globale Variable), dann erklärt sich mir der Sinn sowiso nicht, denn wäre es dann nicht besser gleich den Klassennamen/-aufruf zu verwenden, um später nicht erst noch in der Variable nachschauen zu müssen welche Klasse denn nun gemeint ist?
Hat vielleicht jemand nen Denkanstoß in die richtige Richtung? Oder ob mir das vielleicht jemanden in einer „Version für Begriffsstutzige“ erklären kann?
Zum Schluss (ich weis nicht ob von Belang) hier noch diverse, vielleicht hilfreiche, Infos:
OS: WinXP mit SP2
Python: v2.5.1
A Byte of Python: Zeitstempel vom 05.08.2006 / Übersetzung der Version 1.20 vom 13.01.2005
IDE: Stani's Python Editor v0.8.3.c
Code-Ausführung per Eingabeaufforderung
Ich bedanke mich schonmal im voraus für jeden Versuch mir zu Helfen.