Syntax Frage "self"

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
kornyclown

Zugegeben meine Frage ist vielleicht n bischen blöd aber als relativer Neuling, der die Materie nicht studiert oder der gleichen, ist sie für mein syntaktisches Verständniss sehr wichtig.
Als ich in Büchern und Tutorials auf das schreiben eigener Funktionen gestoßen bin hat mich eins immer sehr unbefriedigt hinterlassen. Das "self"

Ein Beispiel für eine Funktion zum Kekse essen:

Code: Alles auswählen

class KeksEssen():
    def MundAuf(self, OberkieferHoch, UnterkieferRunter)
Wozu genau ist dieses "self".
Es wird immer gesagt dass man das da hinschreiben muss aber ich hab nie verstanden was das eigentlich macht.

Filmzitat aus "Philadelphia":
"Erklären Sie mir das, als wäre ich sechs Jahre alt."
BlackJack

@kornyclown: Bei Methoden wird beim Aufruf auf einem Objekt immer das Objekt auf dem die Methode aufgerufen wird, automagisch als erstes Argument übergeben. Und per Konvention wird der formale Parameter `self` genannt. In Deinem Beispiel würde da also ein Objekt vom Typ `KeksEssen` übergeben.

Was ein schlechter Name für eine Klasse ist, da Klassen ”Dinge” repräsentieren, Kekse essen aber eher eine Tätigkeit ist. Also eher ein Name für eine Funktion oder Methode.
kornyclown

Ok, also auch wenn mein Beispiel nich ganz korrekt ist, bleib ich noch kurz dabei.
Könnte ich dann auch schreiben

Code: Alles auswählen

class KeksEssen():
    def MundAuf(KeksEssen, OberkieferHoch, UnterkieferRunter)
und das "self" vereinfacht es nur für mich oder muss es ganz explizit IMMER "self" sein?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

kornyclown hat geschrieben:Ok, also auch wenn mein Beispiel nich ganz korrekt ist, bleib ich noch kurz dabei.
Könnte ich dann auch schreiben

Code: Alles auswählen

class KeksEssen():
    def MundAuf(KeksEssen, OberkieferHoch, UnterkieferRunter)
Ja, aber du solltest es nicht gerade KeksEssen nennen, das überschreibt den Klassennamen in deiner Methode. Das ist nicht falsch, aber vermutlich nicht erwünscht.
und das "self" vereinfacht es nur für mich oder muss es ganz explizit IMMER "self" sein?
Du kannst es nennen wie du willst, die self zu nennen ist nur Konvention. Eine die man möglichst nicht brechen sollte, da so jeder dritte der dein Programm sieht weiß, was mit self gemeint ist.
kornyclown

Cool, ich glaube ich habe es verstanden aber wahrscheinlich brauch ich noch ein bischen bis es sich manifestiert hat.

Ich versuche das jetzt mal in Menschensprache zu übersetzen:

Ich erschaffe eine class namens KeksEssen(ohne Parameter):
hier definiere ich eine Funktion/Methode namens MundAuf(der erste Parameter verweist auf sich selfst, der zweite Parameter macht OberkieferHoch, der dritte Parameter macht UnterkieferRunter)

Also wenn das jetzt einigermaßen stimmt bin ich einen guten Schritt vorran gekommen, vielen Dank erstmal.
BlackJack

@kornyclown: Also ich würde ja sagen die Beschreibung ist falsch. Klassen haben keine Parameter. Was Du wahrscheinlich meinst ist Du definierst eine Klasse ohne (explizite) Basisklassen. Dann kann man die Klammern auch weg lassen. Bei Python 2.x wäre es sinnvoll explizit `object` als Basisklasse zu verwenden, denn nur dann funktionieren `property()`\s.

Und die Beschreibung zu den anderen beiden Argumenten bei der Methode ist auch komisch. Argumente „machen” nichts. An diese Namen werden einfach nur die Werte gebunden, die man beim Aufruf übergibt. Insofern sind auch da die Namen wieder irreführend.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kornyclown hat geschrieben:Ich versuche das jetzt mal in Menschensprache zu übersetzen:

Ich erschaffe eine class namens KeksEssen(ohne Parameter):
Ergänzend hierzu noch einmal als Anmerkung, dass man KeksEssen eigentlich nicht als Klasse modellieren würde. Klassen sind typischerweise "Dinge" (im weiten Sinne) und Methoden die Aktivitäten dazu. Hier hättest du in einer einfachen, nicht völlig abstrahierten Variante am ehesten so etwas:

Code: Alles auswählen

class Nahrungsmittel:
    def __init__(self, name):
        self.name = name

class Keks(Nahrungsmittel):
    pass

class Mensch:
    def essen(self, nahrung):
        print('Ich esse {0}'.format(nahrung.name))

leckerer_keks =Keks('Keks mit Schokolade')
eric = Mensch()
eric.essen(leckerer_keks)
Sofern du mit Python 2.x arbeitest solltest du Nahrungsmittel und Mensch explizit von object ableiten.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

/me hat geschrieben:

Code: Alles auswählen

eric.essen(leckerer_keks)
Uga, uga. Mjamm, mjamm! ;)

Aber grundsätzlich +1 für deinen Beitrag. Ich wollte gerade anmerken, dass der TE den eigentlichen Sinn von Klassen/Exemplaren bisher nicht wirklich efasst hatte.
Antworten