Seite 1 von 1

Vererbung: gleichbenannte super-Funktionen

Verfasst: Mittwoch 31. März 2010, 14:52
von flix
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]

Verfasst: Mittwoch 31. März 2010, 15:02
von jbs
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)

Verfasst: Mittwoch 31. März 2010, 15:06
von cofi
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.

Verfasst: Mittwoch 31. März 2010, 15:26
von flix
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.

Re: Vererbung: gleichbenannte super-Funktionen

Verfasst: Mittwoch 31. März 2010, 16:19
von Darii
flix hat geschrieben:Aber ich werde das Design umstricken und dafür stattdessen zwei separate Funktionen draus machen.
Vermutlich das beste.