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
self
- 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``
Der Name ist ganz egal, doch wehe du weichst ab von ``self``
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
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
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
-
- 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?
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?
Das self bezieht sich auf "obj", immerhin rufst du ausgehend von "obj" doch "methode" auf.
Der Aufruf
entspricht (sehr grob ausgedrückt)
Der Aufruf
Code: Alles auswählen
obj.methode(300)
Code: Alles auswählen
methode(obj, 300)
Das Leben ist wie ein Tennisball.
-
- 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,
Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
Danke kostonstyle
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
Danke kostonstyle
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.
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.kostonstyle hat geschrieben:Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
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
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.kostonstyle hat geschrieben:Warum hat in der Konstruktur Parameter zwei Unterstrich, heisst das, das der Konstruktur als private definiert wurde?
Danke kostonstyle
http://www.ironpythoninaction.com/magic-methods.html
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- 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?
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?
@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!?
Wann man dass benutzen sollte? Wenn man Objekte hat, bei denen eine Addition eine sinnvolle Operation wäre!?
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
Stefan