Hallo zusammen,
bin gerade auf dem Kriegsfuss mit dem Py Namensraum.
folgendes Problem.
ich habe eine Klasse in einer Datei die via Import eingebunden wird.
Diese Klasse wird sofort nach dem Import instanziert weil diese im ganzen Programm benötigt wird.
Im Hauptprogramm sind paar Funktionen und dort würde ich gerne eine Funktion aus der Instanzierten Klasse aufrufen.
Gibt es eine Möglichkeit auf den Namensraum der Hauptfunktion zuzugreifen - bzw auf die Instanz zuzugreifen.
Vielleicht kann mir jemand helfen ...
Thonix
Python Namensraum
Meinst Du das vielleicht so!?
viking.py:
other.py:
Wenn nicht, dann erkläre mal bitte etwas genauer was Du machen möchtest.
viking.py:
Code: Alles auswählen
class Viking(object):
def conquer(self, land):
pass
eric = Viking()
Code: Alles auswählen
import viking
viking.eric.conquer('Sylt')
So funktionier es.
Ich würde aber gerne die Instanzierung nicht in der getrennten Datei machen sondern in der Haupt Datei
viking.py:
main.py:
Geht das ?
Ich würde aber gerne die Instanzierung nicht in der getrennten Datei machen sondern in der Haupt Datei
viking.py:
Code: Alles auswählen
class Viking(object):
def conquer(self, land):
pass
Code: Alles auswählen
import viking
eric = viking.Viking()
???.eric.conquer('Sylt')
Natürlich. Mit
Code: Alles auswählen
eric.conquer("sylt")
Oh sorry habe noch was vergessen - so geht es klar
Die main.py sieht wie folgt aus:
main.py:
So geht es ned ....
Die main.py sieht wie folgt aus:
main.py:
Code: Alles auswählen
import viking
eric = viking.Viking()
def gibmir():
???.eric.conquer('Sylt')
Code: Alles auswählen
def gibmir():
global eric
eric.conquer(..)
-
- User
- Beiträge: 6
- Registriert: Freitag 8. September 2006, 21:05
- Wohnort: Wiedensahl
was sollen denn die ???
Warum muß er denn eric global deklarieren, wenn eric in main.py instanziert wird?
Warum muß er denn eric global deklarieren, wenn eric in main.py instanziert wird?
unsensibel aber empfindlich
Ich habs doch recht verstanden wenn ein Name nicht gefunden wird, wird im übergeordneten namensraum gesucht - oder ?
wieso funktioniert das aber in meinem fall mit den klassen/instanzen nicht?
und - was wäre stat dem global eine saubere lösung ?
wieso funktioniert das aber in meinem fall mit den klassen/instanzen nicht?
und - was wäre stat dem global eine saubere lösung ?
-
- User
- Beiträge: 6
- Registriert: Freitag 8. September 2006, 21:05
- Wohnort: Wiedensahl
Ich hab jetzt Dein Beispiel bei mir durchlaufen lassen. Was soll ich sagen? Keine Probs.
unsensibel aber empfindlich
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
thonix hat geschrieben:und - was wäre stat dem global eine saubere lösung ?
Code: Alles auswählen
def gibmir(some_viking):
some_viking.conquer(..)
eric = viking.Viking()
gibmir(eric)
Warum? Damit koppelst Du alle Module die auf `eric` zugreifen wollen an `main.py` und `viking.py`. Wenn Du `eric` in `main.py` erzeugst, dann sollten andere Module bzw. deren Funktionen und Methoden das Objekt als Parameter übergeben bekommen.thonix hat geschrieben:So funktionier es.
Ich würde aber gerne die Instanzierung nicht in der getrennten Datei machen sondern in der Haupt Datei
Beschreib doch mal was Du machen möchtest. Also nicht aus Sicht einer Lösung sondern allgemein das Problem.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Für geschachtelte Funktionen gilt das schonmal nicht allgemein. Nicht umsonst unterstützt Python closures.Rebecca hat geschrieben:thonix hat geschrieben:und - was wäre stat dem global eine saubere lösung ?Immer alles, was du in einer Funktion brauchst, als Parameter mit uebergeben.Code: Alles auswählen
def gibmir(some_viking): some_viking.conquer(..) eric = viking.Viking() gibmir(eric)
Auch bei Funktionen auf Modullevel kann man doch ohne Probleme auf Modulvariablen zugreifen; solange man sie nicht neu bindet auch ohne "global".
Mein Problem - mal etwas allgemeiner:
Ziel ist es eine Funktion zu schreiben die in einer speraten Datei abgelegt wird und aus alle Teilen des Programme ereichbar ist.
Verleichbar mit eienr buildin funktion z.b. if
Zusätlich soll diese Funktion Eingenschaften enthalten, die einmal gesetzt werden und danach bei jedem Funktionsaufruf verfügbar sind.
Daher dachte ich das ganze in eine Klasse zu packen...
Ziel ist es eine Funktion zu schreiben die in einer speraten Datei abgelegt wird und aus alle Teilen des Programme ereichbar ist.
Verleichbar mit eienr buildin funktion z.b. if
Zusätlich soll diese Funktion Eingenschaften enthalten, die einmal gesetzt werden und danach bei jedem Funktionsaufruf verfügbar sind.
Daher dachte ich das ganze in eine Klasse zu packen...
Keine schlechte Idee. Das könnte man zum Beispiel so umsetzen (ungetestet):thonix hat geschrieben:Daher dachte ich das ganze in eine Klasse zu packen...
eric.py:
Code: Alles auswählen
class Conquer(object):
def __init__(self, war_cry='huh?'):
self.war_cry = war_cry
def __call__(self, land):
print '%s is all mine, %s!' % (land, self.war_cry)
conquer = Conquer()
Code: Alles auswählen
import eric
import other
def main()
eric.conquer.war_cry = 'Yiiaaaargh'
eric.conquer('Sylt') # -> Sylt is all mine, Yiiaaaargh!
other.function_with_too_long_name() # -> Sweden is all mine, Yiiaaaargh!
Code: Alles auswählen
import eric
def function_with_too_long_name():
eric.conquer('Sweden')