Seite 1 von 1

Elternklasse zur Laufzeit festlegen

Verfasst: Donnerstag 4. August 2011, 21:21
von Poseidonius
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

Re: Elternklasse zur Laufzeit festlegen

Verfasst: Donnerstag 4. August 2011, 21:38
von 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"))

Re: Elternklasse zur Laufzeit festlegen

Verfasst: Donnerstag 4. August 2011, 21:50
von Poseidonius
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

Re: Elternklasse zur Laufzeit festlegen

Verfasst: Freitag 5. August 2011, 08:28
von LivingOn
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"))