Das Objekt "self" beim Aufruf des Konstruktors

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
Data
User
Beiträge: 14
Registriert: Freitag 20. Juni 2003, 19:40

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
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
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!
Ein kleines Beispiel dazu:

Code: Alles auswählen

class Foo:
    def bla(self,s):  print s

f = Foo()

f.bla("bla")
Foo.bla(f,"bla")
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.
In dem folgenden verkürzt dargestellten Beispiel steht der Parameter "self" aber explizit im Aufruf eines vererbten Konstruktors:
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.

War das einigermaßen zu verstehen? ;-)
Jan
Dookie
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
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dookie hat geschrieben:Noch als Anmerkung, man spricht auch von Klassenmethoden und Instanzmethoden.
Aber nicht als Synonym für ungebundene Methode und gebundene Methode, oder? Im obigen geht es nur um "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
Antworten