Was macht 'self', macht es überhaupt was ?

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
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Mittwoch 1. Februar 2006, 14:18

Hi,
mal eine typische Newbiefrage, zu der ich schon die verschiedendsten
Statements gelesen, aber keine zufriedenstellende Antwort bekommen habe. Wozu der Parameter 'self' ? Angeblich macht der nichts, ist also so eine Art Dummy. Stimmt das, oder hat 'self' doch eine elementare Bedeutung in Python, außer das man damit irgendwelche Konventionen befriedigt ? Seven
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 1. Februar 2006, 14:32

Hi!

Ich glaube der Grund, warum man zu dieser Frage keine zufriedenstellende Antwort findet, ist einfach, weil fast niemand die Antwort weiss :D

Eine recht gute Erklärung hat murphy im Rubyforum gegeben. Schau's Dir mal an.

Gruß, mawe
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Mittwoch 1. Februar 2006, 14:49

Natürlich ist self von elementarer Bedeutung. Self ist sozusagen ein Zeiger auf alle Funktionen/Methoden/Variablen der Klasse. Ohne self würde es recht umständlich sein auf Klassenvariablen in Funktionen einer Klasse zuzugreifen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Mittwoch 1. Februar 2006, 15:33

Ich hab das hier schonmal beschrieben.
Und einen Post danach habe ich nochmal (hoffentlich) ein paar Unklarheiten ausgeäumt
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Mittwoch 1. Februar 2006, 18:33

Hallo Alle,
gute Links dabei ! Habe wieder viel gelernt. Scheint ja doch Sinn zu machen das kleine Wort "self". Verstehe ich es richtig, daß wenn "self" der Zeiger auf die Instanz einer Klasse (z.B.) ist, diese nicht instanziert werden könnte, wenn man es wegließe ? Frage, weil ich mich an vollwertiger OOP bislang vorbei gemogelt habe und ich mich in Zukunft mehr und mehr darauf einlassen will. Seven
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Mittwoch 1. Februar 2006, 18:41

Self, analog wie This in C++,
ist die Referenz auf das Object.

Du musst übrigens kein self übergeben, genauso wie in C++.

Es wird dann allerdings recht umständlich, weil ein Object, als ersten Parameter für jede Methode, den Ref auf sich selbst benötigt.


Self übergibt ihn für dich sehr bequem, und erlaubt so, auf die Attribute des Objects zuzugreifen, was sonst nicht möglich wäre.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Donnerstag 2. Februar 2006, 07:59

Wichtig ist vor allen Dingen dass Objekt-Orientierung in jeglicher Form Funktionen mit Objekten in Form von Methoden verknüpft, und diese Methoden wissen müssen auf was sie ausgeführt werden.

Eine Methode ist eine Funktion die an ein Objekt eines bestimmten Typs gebunden ist, zum Beispiel haben Objekte des Typs Apfel die Methode reifen, Objekte des Typs Menschen die Methode Zähne putzen,* usw. Eine Methode ist genauso wie eine Funktion eine abstrakte Beschreibung dessen was passieren muß. Nehmen wir Zähne putzen:

1) Führe Zahnbürste in eigenen Mund mit eigener rechter Hand (okay ich bin Rechtshänder)
2) Bewege eigene rechte Hand so dass Zahnbürste in eigenem Mund hin und her bewegt wird
3) Spucke Zahnpastareste aus eigenem Mund
4) Gehe zum Waschbecken und spüle eigenen Mund

Siehst Du wie oft das Personalpronomen "eigene" auftaucht? Das beschreibt genau, was self ist.

Die Methode Zähne Putzen führt die Zahnbürste nicht in irgendeinen Mund, sondern in den Mund der mit dem aktuellen Objekt verbunden ist, also dem aktuellen Menschen (ich steck Dir schließlich wenn ich die Zähne putze nicht die Zahnbürste in den Hals ;-)).

Genauso braucht Python-Code bei Methodenbeschreibungen eine Möglichkeit auf das eigene Objekt zu verweisen, und da es keine Personalpronomen gibt haben wir self.

Alle weitere Theorie dahinter hat nicht zu interessieren, besonders woher self kommt, wichtig ist nur dass Du das obige verinnerlichst.

--- Heiko.

* okay, auch Menschen haben im allgemeinen die Methode reifen, auch wenn ich mir bei einigen Leuten da nicht so sicher bin...
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Donnerstag 2. Februar 2006, 11:44

modelnine hat geschrieben:Wichtig ist vor allen Dingen dass Objekt-Orientierung in jeglicher Form Funktionen mit Objekten in Form von Methoden verknüpft, und diese Methoden wissen müssen auf was sie ausgeführt werden (...)

(...)Genauso braucht Python-Code bei Methodenbeschreibungen eine Möglichkeit auf das eigene Objekt zu verweisen, und da es keine Personalpronomen gibt haben wir self.

--- Heiko.
Wobei der Eigenbezug ja eigendlich schon daraus hervorgehen sollte, daß ich die Methode 'Zähneputzen' innerhalb des Objektes 'Mensch' deklariere und nicht innerhalb des Objektes 'Apfel' ?
Als Nicht-OOPler (noch) verstehe ich den Vorteil von OOP ja gerade darin, daß ich mit in sich geschlossenen Einheiten arbeite, von deren Methoden ich weiss was sie machen, ohne genau wissen zu müssen, wie sie es machen (wobei es bei der Fehlersuche dann doch oft hilft). Aber die Vorstellung der Refernez auf sich selbst hilft mir, eine bessere Vorstellung von der technischen Funktionsweise von OOP zu bekommen.
Zuletzt geändert von snakeseven am Donnerstag 2. Februar 2006, 15:32, insgesamt 2-mal geändert.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Donnerstag 2. Februar 2006, 14:40

Wobei der Eigenbezug ja eigendlich schon daraus hervorgehen sollte, daß ich die Methode 'Zähneputzen' innerhalb des Objektes 'Mensch' deklariere und nicht innerhalb des Objektes 'Apfel' ?
Nein. Aus der Definition im Rahmen "Mensch" geht der Klassenbezug hervor. Nicht der Eigenbezug, der geht aus self hervor.

Du willst doch nicht dass wenn ich meine Routine Zähneputzen ausführe ich Dir die Zähne putze? Meine Routine Zähneputzen die ich irgendwann mal "einprogrammiert" bekommen habe von meinen Eltern muss doch auch wissen dass ich selbst gemeint bin, nicht das Elternteil was mir das beigebracht hat, zum Beispiel.

Wir sind zwei verschiedene Objekte des Typs Mensch, haben also ungefähr die selben Methoden (weil wir zur selben Klasse gehören). Wir gehören also zur gleichen Klasse, sind aber nicht die gleichen Objekte. Deswegen muß es immer noch den Hinweis geben auf welchen Menschen genau man gerade bezug nimmt wenn man eine Methode beschreibt oder ausführt. Das ist der Eigenbezug.

--- Heiko.
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Donnerstag 2. Februar 2006, 15:31

:D Aah ! Jetzt hats Klick gemacht. Seven
murphy
User
Beiträge: 60
Registriert: Samstag 30. Oktober 2004, 01:34
Wohnort: Berlin
Kontaktdaten:

Donnerstag 2. Februar 2006, 19:24

mawe hat geschrieben:Eine recht gute Erklärung hat murphy im Rubyforum gegeben.
hey, wow, ich bin verlinkt! und das vom Python-forum!
hobbit hat geschrieben:this and so many other discussions seem to suggest that python vs. ruby is about the friendliest language war ever.
:)
Antworten