Hallo,
erstmal wenn Du code postest, schliesse diesen auch in <code>...</code> (statt < und > verwende [ und ]) ein, dann bleiben auch die, gerade bei Python wichtigen, Einrückungen erhalten.
Ich hab hier das Beispiel nochmal dokumentiert
Code: Alles auswählen
class Meldung:
def __init__(self, einString): # Jede Instanz bekommt einen String
self.text = einString # ich merke mir den Verweis auf den String im Attribut text
def druckEs(self): # Schreibe den String
print self.text # ausgabe des Strings auf den das Attribut text zeigt
#---fertig mit der Klassendefinition
m1 = Meldung("Hallo Welt") # erzeuge Instanz
m2 = Meldung("Tschüss, es war kurz aber süss") # und noch eine
notiz = [m1, m2] # bringt die Objekte (eigentlich Verweise auf Objekte) in eine Liste
for msg in notiz: # hole dir nacheinander alle Verweise
msg.druckEs() # druckt jede Meldung sofort aus
So nun zu Deinen Fragen:
Warum steht beim druckEs auch self
druckEs ist wie auch __init__ eine Methode des Objekts der Klasse Meldung. Solche Methoden bekommen immer als ersten Parameter self, dies ist der Verweis (ein Zettelchen mit der Adresse) auf das Objekt selbst. Dadurch kann dann in druckEs auf den Eintrag in self.text zugegriffen werden.
warum muss man print self.text und nicht einfach print einString
einString, war nur ein Zettelchen für __init__, das wurde mit dem Beenden von __init__ in den Converter geschmissen. Aber vorher wurde die Adresse die draufstand ja in __init__ mit
self.text = einString geschrieben.
und die letzte frage für heute.
wie kann msg auf druckEs zugreifen es wurde ja nirgendwo eine instanz erstellt
msg = Meldung() oder????
Doch es wurden sogar 2 Instanzen erstellt
Code: Alles auswählen
m1 = Meldung("Hallo Welt")
m2 = Meldung("Tschüss, es war kurz aber süss")
Meldung("Hallo Welt") erstellt eine Instanz. Die Anweisung
m1 = Meldung("Hallo Welt") bedeutet für den Interpreter, erstelle eine Instanz von Meldung. Der Interpreter sagt der Klasse Meldung: "Hallo Klasse Meldung, ich brauch eine Instanz von Dir mit dem String 'Hallo Welt" als Parameter. Die Klasse gibt dann dem Interpreter die Adresse der neuen Instanz zurück und der Interpreter schreibt sich die Adresse auf das Zettelchen m1. Das gleiche passiert dann nochmal, allerdings mit dem String ""Tschüss, es war kurz aber süss" als Parameter und der Interpreter schreibt sich die Adresse, die ihm die Klasse für die zweite Inszanz liefert, auf den Zettel m2.
Wie kann nun msg auf druckEs zugreifen? msg ist wieder nur ein Zettelchen. Zuvor wurd ja eine Liste erstellt, die kannst Du dir als Block vorstellen. Also viele Zettelchen wo Adressen von Objekten(Instanzen) abgelegt sein können. Das erledigte die Anweisung notiz = [m1, m2]. Das erzeut eine Liste mit den Verweisen auf die Instanzen auf die m1 und m2 zeigen.
for msg in notiz: bedeutet, hol dir aus der Liste, deren Adresse auf dem Zettelchen "notiz" steht, jeden Eintrag (also die Adressen der Objekte (Instanzen) auf die auch m1 und m2 zeigen) und schreib ihn auf den Zettel msg. Im Gegensatz zu echten Zetteln, kann man die variablen wie msg auch überschreiben, dabei geht der alte Inhalt verloren und wird durch den neuen ersetzt. So zeigt msg beim ersten mal auf die Instanz auf die auch m1 zeigt, und beim zweiten Mal auf die Instanz auf die m2 zeigt.
Jetzt dürfte klar sein, wie
msg.druckEs() funktioniert. msg ist eben kein Objekt, sonder nur der Verweis auf das Objekt. Da druckEs eine Methode ist, bekommt sie als ersten Parameter auch einen Verweis auf sich selber auf dem Zettelchen self, es gibt ja mehr Objekte der Klasse Meldung, die sich die Methode druckEs teilen. Der Interpreter schreibt die Adresse die auf dem Zettelchen msg steht auf das zettelchen self, das an die Methode printEs übergeben wird. So kann druckEs die Attribute von der Instanz deren Adresse auf self steht verwenden. in dem Fall das Attribut "text" und den String, auf den self.text zeigt ausgeben.
Gruß
Dookie