Vererbung: gleichbenannte super-Funktionen

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
Benutzeravatar
flix
User
Beiträge: 9
Registriert: Freitag 11. März 2005, 18:21
Wohnort: Freiburg

Moin,

ich hab' das Problem, das eine Sub-Klasse eine super-Funktion aufruft, die super-Funktion danach jedoch wieder zur Sub-Klasse zurückkehrt. Verwirrend, ich weiß, deswegen beschreib' ich mal, was passiert:

Ich habe zwei Klassen A und B, die prinzipiell folgendermaßen definiert sind:

Code: Alles auswählen

class A(object):
  def f(self):
     print "A.f()"
     self.g()

  def g(self):
     print"A.g()"

class B(A):
  def f(self):
     print "B.f()"
     super(B, self).f()

  def g(self):
     print"B.g()"
Also, B erbt von A und definiert die funktionen f und g neu. In der Funktion B.f() rufe ich jetzt einfach die Funktion f der Superklasse auf. Diese Funktion ruft wiederum self.g auf, wo ich erwartet hätte, das dann die Funktion g aus der Superklasse benutzt wird.
Was aber passiert ist Folgendes:

Code: Alles auswählen

>>>a, b = A(), B()
>>>a.f()
A.f()
A.g()
>>>b.f()
A.f()
B.g()
Das heißt, das self.g innerhalb der Superklasse wieder zu Funktion g aus der Subklasse B zurückspringt. Erwartet hätte ich aber, das in diesem Fall A.g() aufgerufen wird.

Weiß da jemand Rat? Wie kann ich forcieren, dass in diesem Fall A.g() aufgerufen wird?[/code]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du übergibst ja self und self ist eine Instanz von B. Das heißt wenn du self.g aufrufst sucht er in B nach g und wird dort auch fündig.


Klingt aber nach kaputtem Design, und super hat auch seine Tücken.

Quick and Dirty:

Code: Alles auswählen

#class A
def f(self):
    A.g(self)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du kannst `A.g` mit

Code: Alles auswählen

A.g(self)
forcieren. ABER das sollte man sich genau ueberlegen.
Vielleicht kannst du mal erklaeren, was du vorhast und warum du der Unterklasse keine Polymorphie zugestehen willst.
Benutzeravatar
flix
User
Beiträge: 9
Registriert: Freitag 11. März 2005, 18:21
Wohnort: Freiburg

vielen Dank für die Antworten.

Was ich vorhabe ist, das die Subklasse B eine etwas komplexere Version von Klasse A wird. In Klasse B habe ich auch die Funktion f, die, wenn sie einen bestimmten Parameter bekommt, die Funktion f der super-Klasse aufrufen soll, ansonsten soll sie mit dem neuen Code arbeiten.

Aber ich werde das Design umstricken und dafür stattdessen zwei separate Funktionen draus machen.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

flix hat geschrieben:Aber ich werde das Design umstricken und dafür stattdessen zwei separate Funktionen draus machen.
Vermutlich das beste.
Antworten