Elternklasse zur Laufzeit festlegen

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
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Hallo zusammen,

ich möchte einer generischen Klasse abhängig von einem Initialisierungsparameter eine Elternklasse zuweisen. Ich stelle mir vor, dass die Klasse "MeinHaustier" in Abhängigkeit von einem Parameter bei der Instanziierung Fido=MeinHaustier("Hund") eben von der Klasse "Hund" erbt, für MeinHaustier("Katze") von der Klasse "Katze" usw. ... geht so was überhaupt?

Freue mich auf Eure Kritik, Anmerkungen usw.

Poseidonius
deets

Ich glaube, was du hier willst ist nicht eine abhaengige Elternklasse. Dein Beispiel gibt das ja auch nicht her: Katze & Hund sind Haustiere, also ist Haustier die Basisklasse - nicht umgekehrt.

Fuer mich hoert sich das nach einem factory-Pattern an, welches in Python in verschiedenen Weisen geloest werden kann. ZB mit der __new__-methode.

Code: Alles auswählen



class Haustier(object):

    def __new__(cls, art):
        if art == "Hund":
            cls = Hund
        elif art == "Katze":
            cls = Katze
        else:
            raise Exception("Unbekanntes Haustier! Angst bekommen!")
        return object.__new__(cls)


class Hund(Haustier):
    pass


class Katze(Haustier):
    pass


print type(Haustier("Hund"))
print type(Haustier("Katze"))
print type(Haustier("Maus"))
Poseidonius
User
Beiträge: 63
Registriert: Montag 23. Januar 2006, 08:58

Cool ! Genau das, was ich brauchte ... und einen schneiden Bezeichner obendrauf "factory-pattern"!

Tausend Dank für die schnelle Antwort an deets!

Grüße

Poseidonius
LivingOn
User
Beiträge: 33
Registriert: Montag 11. August 2008, 07:53

Und so spart man sich noch die lästige Fallunterscheidung ;-)

Code: Alles auswählen

class Haustier(object):

    def __new__(cls, art):
        klasse =  [i for i in HaustierType.__subclasses__() if i.__name__ == art]
        if klasse:
            return HaustierType.__new__(klasse[0])
        else:
            raise Exception("Unbekanntes Haustier! Angst bekommen!")

class HaustierType(object):
    pass

class Hund(HaustierType):
    pass

class Katze(HaustierType):
    pass

print type(Haustier("Hund"))
print type(Haustier("Katze"))
print type(Haustier("Maus"))
Antworten