Hallo,
aus Python-Büchern habe ich gelernt, dass bei der Definition von Methoden einer Klasse das Objekt "self" immer der erste formale Parameter der Methode ist. Macht ja auch Sinn, weil die Methode das Objekt bearbeitet. Beim Aufruf einer Methode darf man schreibfaul sein und den ersten Parameter weglassen. Soweit - so gut!
In dem folgenden verkürzt dargestellten Beispiel steht der Parameter "self" aber explizit im Aufruf eines vererbten Konstruktors:
class Testvater:
def __init__(self):
self. attribut = "keine Idee"
class Testkind(Testvater):
def __init__(self):
Testvater.__init__(self)
Wahrscheinlich handelt es sich hier nicht nur um eine syntaktische Konvention. Es gibt bestimmt eine logische Erklärung, warum der Parameter "self" beim Aufruf des Konstruktors aus der Superklasse explizit genannt werden muss. Welche?
Data
Das Objekt "self" beim Aufruf des Konstruktors
Hallo!
Die letzten beiden Zeilen sind identisch! Die Stichwörter sind gebundene und ungebundene Methode. In der Regel ruft man Methoden direkt über die Instanz auf, an die die Methode gebunden ist.
Man kann aber auch über die Klasse die Methode aufrufen, der man dann aber, da sie an keine Instanz gebunden ist, als erstes Argument eine Instanz der Klasse mitgeben muss. Hauptsächlich wird diese 2. Methode benutzt, wenn es darum geht, in abgeleiteten Klassen Methoden der Basisklasse zu überschreiben, denn dort hat man schlicht keine Instanz der Basisklasse zur Verfügung.
War das einigermaßen zu verstehen?
Jan
Ein kleines Beispiel dazu:Data hat geschrieben:aus Python-Büchern habe ich gelernt, dass bei der Definition von Methoden einer Klasse das Objekt "self" immer der erste formale Parameter der Methode ist. Macht ja auch Sinn, weil die Methode das Objekt bearbeitet. Beim Aufruf einer Methode darf man schreibfaul sein und den ersten Parameter weglassen. Soweit - so gut!
Code: Alles auswählen
class Foo:
def bla(self,s): print s
f = Foo()
f.bla("bla")
Foo.bla(f,"bla")
Man kann aber auch über die Klasse die Methode aufrufen, der man dann aber, da sie an keine Instanz gebunden ist, als erstes Argument eine Instanz der Klasse mitgeben muss. Hauptsächlich wird diese 2. Methode benutzt, wenn es darum geht, in abgeleiteten Klassen Methoden der Basisklasse zu überschreiben, denn dort hat man schlicht keine Instanz der Basisklasse zur Verfügung.
Dürfte jetzt klarer sein. Der Ctor wird hier ja nicht über eine Instanz aufgerufen, sondern als ungebundene Methode über den Klassennamen. Und damit der Ctor der Basisklasse weiß, um welche Instanz es geht, wird sie als Argument übergeben.In dem folgenden verkürzt dargestellten Beispiel steht der Parameter "self" aber explizit im Aufruf eines vererbten Konstruktors:
War das einigermaßen zu verstehen?
Jan
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Noch als Anmerkung, man spricht auch von Klassenmethoden und Instanzmethoden. Klassenmethoden zeichnen sich dadurch aus, das sie schon bei der Definition kein self als ersten Parameter haben.
Gruß
Dookie
Gruß
Dookie
Aber nicht als Synonym für ungebundene Methode und gebundene Methode, oder? Im obigen geht es nur um "Instanzmethoden".Dookie hat geschrieben:Noch als Anmerkung, man spricht auch von Klassenmethoden und Instanzmethoden.
Mit den Begriffen ist das so eine Sache. Im OReilly-Buch "Einführung in Python" wird der Begriff 'Klassenmethode' für Methoden benutzt, die auf Instanzen arbeiten, also für die üblichen Methoden, die ich einfach nur als 'Methode' bezeichnen würde (egal ob gebunden oder ungebunden). Unter 'Klassenmethode' verstehe ich eigentlich 'statische Methoden', die bei Python eher unüblich sind und die es auch noch gar nicht so lange gibt (Wenn ich Deinen 2. Satz richtig deute, ist das auch Deine Lesart von 'Klassenmethode'.) Zumindest wird in meinen Java- und C++-Büchern 'Klassenmethode' und 'statische Methode' synonym verwendet, aber auch im Python-Nutshell-Buch.
Jan