Seite 1 von 1

mehrfachvererbung identische funktionsnamen in elternklassen

Verfasst: Sonntag 16. Dezember 2007, 10:14
von snape
Hallo,

Code: Alles auswählen

class Steppentier(object):
    def schlafen(self):
        print "steppentier: schnarch"
class Fleischfresser(object):
    def schlafen(self):
        print "fleischfresser: schnorchel"
    def ratzen(self):
        self.schlafen()
    def pennen(self):
        print "fleischfresser: schnorchel"
class Loewe(Steppentier, Fleischfresser):
    def __init__(self):
        print " Löwe"
l = Loewe()
l.schlafen() #ausgabe = "steppentier: schnarch"
l.ratzen()   #ausgabe = "steppentier: schnarch" !!
l.pennen()   #ausgabe = "fleischfresser: schnorchel"
python scheint namenskonflikte zu umgehen, indem es bei identischen funktionsnamen in den elternklassen immer die funktion der erstgenannten nimmt.
kann ich auch die funktion in der "zweiten" ansprechen?
wenn ja: wie geht das?

vielen dank fuer jeden tipp.

beste gruesse

Verfasst: Sonntag 16. Dezember 2007, 10:41
von BlackJack
Mein Tipp wäre: Mehrfachvererbung vermeiden. Ansonsten den im anderen Thread angesprochenen Text zu `super()` lesen und das wissen richtig anwenden.

Verfasst: Sonntag 16. Dezember 2007, 10:47
von sma
Du kannst ausnutzen, dass ungebundene Methoden wie Funktionen aufgerufen werden können, und damit wählen, welche Methode welcher Oberklasse aufgerufen werden soll:

Code: Alles auswählen

class A(B, C):
  def foo(self, x, y):
    C.foo(self, x, y)
    ...
Diese Artikel fand ich ganz hilfreich, um die Auswahlreihenfolge der Methoden bei Mehrfachvererbung zu verstehen.

Stefan

Verfasst: Sonntag 16. Dezember 2007, 13:15
von mitsuhiko
In dem Fall nutzt du Mehrfachvererbung möglicherweise falsch. Mehrfachvererbung entweder konsequent mit super() oder als Mixins verwenden.