Seite 1 von 1
Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:08
von Sephiroth
Hallo!
ich schreibe gerade mit python /pygame ein kleines Jump and run Spiel.
Nun zum Problem:
Ich habe mir eine Art "ressourceLoader"-Klasse geschrieben. diese verwaltet ein dictionary indem alle Graphiken mit Filename abgelegt sind. Will ich nun irgendwo im Programm eine Graphik laden führe ich eine methode dieser ressource-loader klasse aus, die mir die entsprechende graphik aus dem dict zurückgibt.
Sieht folgendermaßen aus:
Code: Alles auswählen
import pygame
import os
class RessourceLoader():
def __init__(self):
self.graphicDict = {}
def load_graphic(self, filename):
path = os.path.join('..', 'data', 'gfx', filename)
try:
if not path in self.graphicDict:
self.graphicDict[filename] = pygame.image.load(path).convert_alpha()
except:
print("Error while loading graphic: ", path)
return self.graphicDict[filename]
Das funktionert auch alles wunderbar. Wie kann ich jetzt jedoch überall im gesamten Programm auf dieses ein Objekt der Klasse zugreifen, da bei Programmstart initialisiert wird?
Klar, ich könnte es immer weiter durchgeben als Parameter, doch das macht mir das ganze ein wenig zu unübersichtlich.
Game -> Levelmanager -> Level -> Map -> Sprite -> Animation -> Image(hier wird die methode erst aufgerufen)
Ihr seht das ganze ist ziemlich verzweigt. Und um Hintergrundbilder o.ä. zu laden kann ich ähnliche ketten aufstellen.
So müssten 75% meiner Klassen im gesamten Spiel diesen ressourceLoader als Parameter haben. gefällt mir rigendwie nicht:/
Gibt es eine "schöne" Möglichkeit wie ich bei programmstart ein Objekt erstelle und immer und überall darauf zugreifen kann?
Wie würdet ihr das ganze implementieren?
greetings
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:24
von cofi
Dann initialisiere es doch in _diesem_ Modul und benutze dann die Instanz statt der Klasse.
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:25
von Pekh
Meiner Meinung nach solltest du das nicht mit einer Klasse lösen. Ich würde es als Funktion in einem Modul 'tools' oder 'utils' bereitstellen und dieses Modul dann überall dort importieren, wo du es benötigst.
Nachtrag: Mir fehlt leider ein wenig die Erfahrung mit PyGame, aber willst du wirklich alle Grafiken im Speicher halten? Darauf läuft dein Ansatz mit dem Dictionary ja hinaus. Das kann natürlich Sinn machen, muß aber nicht.
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:40
von Sephiroth
cofi hat geschrieben:Dann initialisiere es doch in _diesem_ Modul und benutze dann die Instanz statt der Klasse.
Wenn ich in jedem Modul neu Instanziere habe ich ja ejdesmal ein neues grafik-dictionary. Das sollte für das ganze Programm gültig sein.
Pekh hat geschrieben:Meiner Meinung nach solltest du das nicht mit einer Klasse lösen. Ich würde es als Funktion in einem Modul 'tools' oder 'utils' bereitstellen und dieses Modul dann überall dort importieren, wo du es benötigst.
Wenn ich die Funktion einfach ein Modul schreibe, wo soll ich dann das dictionary ablegen?
Meint ihr so in der Art?
Kurz getestet scheint das zu funktionieren, aber nur mit dem global keyworld. Ohne werden neue dicts erstellt.
Code: Alles auswählen
import pygame
import os
self.graphicDict = {}
def load_graphic(self, filename):
global graphicDict
path = os.path.join('..', 'data', 'gfx', filename)
try:
if not path in self.graphicDict:
self.graphicDict[filename] = pygame.image.load(path).convert_alpha()
except:
print("Error while loading graphic: ", path)
return self.graphicDict[filename]
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:43
von BlackJack
@Sephiroth: Das funktioniert auch ohne ``global`` aber sicher *so* wie's da steht überhaupt nicht. Was soll denn `self` hier sein?
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:47
von cofi
Sephiroth hat geschrieben:cofi hat geschrieben:Dann initialisiere es doch in _diesem_ Modul und benutze dann die Instanz statt der Klasse.
Wenn ich in jedem Modul neu Instanziere habe ich ja ejdesmal ein neues grafik-dictionary. Das sollte für das ganze Programm gültig sein.
Les den Satz nochmal, genau _das_ meinte ich nicht.
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 19:58
von Sephiroth
BlackJack hat geschrieben:@Sephiroth: Das funktioniert auch ohne ``global`` aber sicher *so* wie's da steht überhaupt nicht. Was soll denn `self` hier sein?
War ein copy/paste Fehler die self's
cofi hat geschrieben:Sephiroth hat geschrieben:cofi hat geschrieben:Dann initialisiere es doch in _diesem_ Modul und benutze dann die Instanz statt der Klasse.
Wenn ich in jedem Modul neu Instanziere habe ich ja ejdesmal ein neues grafik-dictionary. Das sollte für das ganze Programm gültig sein.
Les den Satz nochmal, genau _das_ meinte ich nicht.
Was meinst du genau mit "_diesem_" Modul?
(In meinem aktuellen Sprachgebrauch setzte ich "Modul" mit ".py-Datei" gleich. Folglich habe ich in meinem Programm recht viele Module. (Von denen sehr viele Zugriff auf dieses dictionary benötigen.) Welches meinst du also mit "_diesem_" Oder hab ich gerasde einen Denkfehler)
Gruß
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 20:14
von cofi
Das in dem du `RessourceLoader` definierst.
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 21:01
von Sephiroth
jop, dann muss ich allerdings an alle anderen Klassen das Objekt als Parameter weitergeben oder gibts noch eine andere Möglichkeit?
Wollte nämlich verhindern das so eine "helfer-klasse" durch das halbe programm gereicht wird
siehe: Game -> Levelmanager -> Level -> Map -> Sprite -> Animation -> Image(hier wird die methode erst aufgerufen)
obwohl sie nur ganz am Ende überhaupt benutzt wird.
ich glaube mittlerweile das ich den Aufbau des Programms etwas umstrukturieren sollte und das Problem irgendwie umgehen sollte, da es wohl kein einfaches Patentrezept gibt so wie ichs mirs vorstelle.
greetings
Edit:
Ok, vergesst was ich gesagt habe. Ich glaube eine Lösung gefunden zu haben.
Ich definiere das dictionarry einfach als statische member variable..
Dann kann ich die Klasse überall neu instanzieren und all instanzen nutzen trotzdem das gleiche dictionarry
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 21:23
von Barabbas
Hallo Sephiroth,
ich glaube, cofi spricht von Singletons. Such einfach mal danach: Du kannst tatsächlich Instanzen von Klassen importieren. Wobei ich immer dachte, das sei eher ein "don't" aber so gut kenne ich mich mit Design-Prinzipien in Python leider nicht aus.
Diese Seite habe ich mir dazu mal gebookmarked - sie ist aber gerade unerreichbar:
http://lucumr.pocoo.org/2009/7/24/singl ... -in-python
Gruß,
brb
Re: Zugriff auf Objekt überall im Programm
Verfasst: Freitag 17. September 2010, 22:23
von BlackJack
@Sephiroth: Es war gemeint, dass Du in *einem* Modul ein Exemplar erstellst und dieses *eine* Exemplar dann überall verwendest. Alternativ kann eben auch ein Modul selbst als Singleton herhalten, denn im Normalfall sind Modulobjekte ja Singletons.