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
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

Hallo
habe eine Frage zu Methode, warum erwartet jede Methode immer ein "Self", also eine Instanz von sich selber, was ist der Sinn dahinter?

Danke kostonstyle
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Sinn dahinter ist, dass du Funktionen im Scope der Klasse schreibst und die eine explizite Bindung an das Exemplar erwarten, die erst zur Laufzeit erzeugt werden, und mit der die zu Methoden werden.

Der Name ist ganz egal, doch wehe du weichst ab von ``self`` :twisted:
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Eine Antwort findet sich z. B. unter http://effbot.org/pyfaq/why-must-self-b ... -calls.htm
https://www.xing.com/go/invite/18513630.6a91d4
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die einfachste Erklärung ist, dass es eben so ist. In Sprachen wie Smalltalk, Ruby oder Java ist das `self` bzw. `this` implizit, muss (bzw. kann) also nicht explizit in der Parameterliste stehen. In Python hat man sich entschieden, es explizit zu machen. Das man `self` benutzt ist reine Konvention. Man könnte auch `this` oder `me` oder `receiver` benutzen.

Achtung: Das `self` ist natürlich kein Exemplar der Methode (so wie kostonstyle es formuliert) sondern ein Exemplar der Klasse, das der Empfänger der Nachricht (in Smalltalk-Sprech) ist, also für das die Methode aufgerufen wurde.

PS: Der zitierte Artikel bringt IMHO keine überzeugenden Argumente vor. Außerdem argumentiert er nicht, warum das `self` in der Parameterliste stehen muss, sondern warum es praktisch ist, wenn man's bei Attributzugriffen und Methodenaufrufen erzwingt.

Stefan
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

was ist aber die idee dahinter, man macht doch etwas nicht um sonst.
also es ist vergleichbar wie in java mit this. Aber ich sehe das Problem bei der Übergabe von Parameter. Zum Beispiel
methode(self, para1)

beim Aufruf von Methode
obj.methode(300)

ist jetzt die Zahl 300 für self bestimmt oder für para1?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das self bezieht sich auf "obj", immerhin rufst du ausgehend von "obj" doch "methode" auf.

Der Aufruf

Code: Alles auswählen

obj.methode(300)
entspricht (sehr grob ausgedrückt)

Code: Alles auswählen

methode(obj, 300)
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

vielen dank, habe den artikel gelesen, aber leider keine klare erleuchtung erlangt.
habe noch eine andere Frage,

Code: Alles auswählen

def __init__(self, __Inhaber, __Kontonummer, __Kontostand,
                       max_tagesumsatz=1500):
        Zaehler.__init__(self) # Wichtige Zeile

        self.__Inhaber = __Inhaber
        self.__Kontonummer = __Kontonummer
        self.__Kontostand = __Kontostand
        self.__MaxTagesumsatz = max_tagesumsatz
        self.__UmsatzHeute = 0
Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
Danke kostonstyle
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nein, das ist einfach nur ganz ganz grausamer Stil. Offensichtlich das Beispiel aus dem Openbook, nur noch schlechter umgesetzt. Vergiss dass es doppelte Unterstriche und das Openbook gibt. Vernünftige Tutorials findest du im den [wiki=FAQ]FAQ[/wiki].
Das Leben ist wie ein Tennisball.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

kostonstyle hat geschrieben:Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
Das `__init__` schreibt man einfach so. Designentscheidung von GvR um 1991 oder so. Nicht wundern. Würde er wahrscheinlich heutzutage anders machen. Alle Erklärungen dazu sind nachträglich erfunden und egal.

Die zwei vor allen anderen Namen niemals benutzen, sie haben da keinen Sinn sondern machen das ganze nur schwer lesbar. Die lokale Variable `foo` lässt sich ja von dem Attribute `foo` dadurch unterscheiden, dass dieses immer mit einem Exemplar (z.B. `self.foo`) qualifiziert werden muss.

Es gibt die Konvention bei Python (aber niemals bei Parametern oder lokalen Variablen), durch einen Unterstrich dem geneigten Leser anzudeuten, dass ein Attribut oder eine Methode privat sein soll. Mehr ist das nicht. Es gibt ein Feature mit zwei führenden Unterstrichen, aber das kann man getrost vergessen. Braucht man eigentlich nie.

Stefan
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

kostonstyle hat geschrieben:Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
Danke kostonstyle
2 ``_`` davor und danach kennzeichnen die Methoden als "magisch", d.h. sie haben fuer Python eine besondere Bedeutung, neben ``__init__`` gibt es z.B. noch ``__new__``, ``__add__`` usw.

http://www.ironpythoninaction.com/magic-methods.html
kostonstyle
User
Beiträge: 148
Registriert: Sonntag 2. November 2008, 12:13

genau, das ist das nächste Thema, das ich mühe habe, die magic methode.
wie kann ich zum Beispiel __add__(self, other) verwenden, und wenn sollte ich es verwenden. Der Parameter Other, ist das eine Instanz? Magic Method __add__ sollte doch der Operator + ersetzen?
In wiefern braucht man diese Magic Method?
BlackJack

@kostonstyle: Hm, wenn Du ``a + b`` hast, dann wird auf `a` die `__add__()`-Methode aufgerufen. Nun rate mal an was `self` und `other` dann gebunden sind.

Wann man dass benutzen sollte? Wenn man Objekte hat, bei denen eine Addition eine sinnvolle Operation wäre!?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Magisch sind diese Methoden nicht. Das Wort taucht in der offiziellen Sprachbeschreibung nicht auf. Die einfache Regel ist, dass `a + b` eine Umschreibung (syntaktischer Zucker) für `a.__add__(b)` ist. Galt dies bei Python 1.x noch nur für Exemplare von Klassen, gilt es in Python 2.x immer. Daher findet man auch im Typ `int` oder `str` passende Methoden. Die Methoden existieren, damit man den "Operator" `+` für eigene Datentypen überschreiben kann. Andere Methoden wie z.B. `__getitem__` existieren, damit man sich eigene Datentypen schaffen kann, die sich wie Sequenzen verhalten.

Stefan
Antworten