PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python: Instanzen von Klassen unbekannten Namens erzeugen



delmonico
07-02-2005, 18:19
edit: sorry, falsches forum kann das mal wer zu den Scriptsprachen verschieben?
Hi

Hab in dive into python gelesen, wie man funktionen unbekannten Namens aufrufen kann:
http://www.diveintopython.org/power_of_introspection/getattr.html#d0e9362

Aber ich checks noch nicht so ganz.

Also was ich will ist folgendes. Ich hab mehrere Klassen PowerupXY, die alle von Powerup abgeleitet sind. Bislang mach ich das so, dass wenn ich ein neues Powerup erstelle, ich erst bei randint(1,x) das x durch die neue gesamtzahl der möglichen Powerups ersetze und dann ein neues elif anfüge, um ein Objekt dieser Klasse zu erzeugen:

powerupType=randint(1,3)
if powerupType==1:
self.powerup=PowerupSpeedUp(["speedup.png"])
elif powerupType==2:
self.powerup=PowerupColorBomb(["bomb_fr1.png","bomb_fr2.png","bomb_fr3.png"])
elif powerupType==3:
self.powerup=PowerupFreeze(["glue.png"])

Geil wäre natürlich wenn ich das so machen könnte, dass ich mir mittels listdir ne Liste des Verzeichnis data/powerups/ mache und dann darin meine unterordner SpeedUp, ColorBomb, Freeze habe und dann halt mit sonem getattr() gedönes eben die entsprechenden Klassen aufrufe. Aber ich check einfach nicht, wie ich das hinbekomme...

Erm.. versteht jetz überhaupt wer, was ich meine?

MfG, del

tuxipuxi
08-02-2005, 18:56
Hi,

du kannst dafür getattr() nutzen, die Klassen müssen jedoch in ihrem eigenen Modul sein. Das geht dann so:
powerup = getattr(the_module, "ClassName")
Falls du kein eigenes Modul willst, musst du ein Dict machen und die Instanzen darüber erzeugen.
exec() wäre auch noch eine Möglichkeit, aber die ist unsafe.

Gruß

delmonico
08-02-2005, 19:17
Hmmm schon ma danke für die Antwort. Eigenes Modul muss nich wirklich sein, wie würde es über ein Dict gehen? Die Namen in ein Dict speichern is nich so das problem, aber wie erzeug ich dann die Instanzen?

fs111
09-02-2005, 07:46
def factory(className, *args):
aClass = getattr(__import__(__name__), className)
return apply(aClass, args)


HTH

Grüße fs111

delmonico
09-02-2005, 17:47
Yeah danke so geht das schon wunderbar.

Eine Frage hab ich noch: Wie kann ich den Namen der Klasse von self herausfinden?

edit: Habs :) self.__class__.__name__