Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Python: Instanzen von Klassen unbekannten Namens erzeugen

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.07.2003
    Beiträge
    33

    Python: Instanzen von Klassen unbekannten Namens erzeugen

    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_...r.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:
    Code:
    				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
    Geändert von delmonico (07-02-2005 um 20:06 Uhr)

  2. #2
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    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ß

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.07.2003
    Beiträge
    33
    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?

  4. #4
    Registrierter Benutzer Avatar von fs111
    Registriert seit
    23.03.2002
    Beiträge
    594
    Code:
     
    def factory(className, *args):
        aClass = getattr(__import__(__name__), className)
        return apply(aClass, args)
    HTH

    Grüße fs111
    ....::::Mein Blag::::....

  5. #5
    Registrierter Benutzer
    Registriert seit
    03.07.2003
    Beiträge
    33
    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__
    Geändert von delmonico (09-02-2005 um 18:11 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •