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"))