mehrfachvererbung identische funktionsnamen in elternklassen

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
snape
User
Beiträge: 5
Registriert: Freitag 14. Dezember 2007, 20:19

Sonntag 16. Dezember 2007, 10:14

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
BlackJack

Sonntag 16. Dezember 2007, 10:41

Mein Tipp wäre: Mehrfachvererbung vermeiden. Ansonsten den im anderen Thread angesprochenen Text zu `super()` lesen und das wissen richtig anwenden.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 16. Dezember 2007, 10:47

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sonntag 16. Dezember 2007, 13:15

In dem Fall nutzt du Mehrfachvererbung möglicherweise falsch. Mehrfachvererbung entweder konsequent mit super() oder als Mixins verwenden.
TUFKAB – the user formerly known as blackbird
Antworten