Von Oberklasse auf Methode einer Unterklasse zugreifen?

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
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Hallo liebe Python-Experten,

diesmal stehe ich vor einem etwas komplizierten und verzwickten Problem. Aber ich versuche, es so einfach wie möglich zu erklären:

Ich habe eine Oberklasse und mehrere Unterklassen, die alle von dieser Oberklasse abgeleitet sind. Alle Unterklassen besitzen jeweils eine Methode mit demselben Namen. Ich möchte nun die Oberklasse mit einem bestimmten Argument aufrufen. Je nachdem, welches Argument ich angegeben habe, soll nun aber keine Instanz der Oberklasse gebildet werden, sondern eine Instanz einer bestimmten Unterklasse. Ich versuche mal, das anhand eines Minimalbeispiels bildlich darzustellen:

Code: Alles auswählen

class Oberklasse(object):
    # Diese Oberklasse beinhaltet noch einige Methoden, 
    # auf die die Unterklassen zugreifen können.
    # Diese Methoden sind hier jetzt unwichtig.


class Unterklasse_1(Oberklasse):
    # Jede Unterklasse besitzt eine Methode mit diesem Namen:
    def methode_x(self):
        # ...    


class Unterklasse_2(Oberklasse):
    def methode_x(self):
        # ...
Ich möchte nun folgendes erreichen:

Code: Alles auswählen

# Bei Angabe von "argument_A" soll eine Instanz von Unterklasse_1 erzeugt werden
instanz_A = Oberklasse("argument_A")
# Bei Angabe von "argument_B" soll eine Instanz von Unterklasse_2 erzeugt werden
instanz_B = Oberklasse("argument_B")

# methode_x() soll dann jeweils die Methode der entsprechenden Unterklasse sein
instanz_A.methode_x()
instanz_B.methode_x()
Wie kann ich das realisieren :?:

Ich glaube, dass die __new__-Methode hier angebracht ist, allerdings kapiere ich nicht ganz, wie die funktioniert. Bevor ihr übrigens nach dem Sinn fragt: Glaubt mir, es hat einen Sinn. :wink:

Vielen Dank im Voraus für jeden Vorschlag. :)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Ja, __new__ ginge. Du müsstest dann einfach anhand des Arguments unterscheiden.

Code: Alles auswählen

class Oberklasse(object):
    def __new__(cls, switch):
        if switch == "argument_A":
            return object.__new__(Unterklasse_1)
        else:
            return object.__new__(Unterklasse_2)
Ich würde allerdings eher die Finger von __new__ lassen und lieber eine extra Klassenmethode dafür bemühen.

Code: Alles auswählen

class Oberklasse(object):
    @classmethod
    def new(cls, switch):
        if switch == "argument_A":
            return Unterklasse_1()
        else:
            return Unterklasse_2()

Oberklasse.new("argument_A")
Ist finde ich schöner und bei der Verwendung von __new__ muss man einfach zu sehr aufpassen nichts kaputt zu machen...
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Herzlichen Dank, Darii. Funktioniert perfekt. :D
Jetzt weiß ich auch endlich, wie man __new__ korrekt verwendet. Ich hatte vorher in den Docs nachgeschaut, aber bin daraus nicht wirklich schlau geworden. Wieder was gelernt. :mrgreen:
Antworten