Seite 1 von 1

Python Namensraum

Verfasst: Donnerstag 7. September 2006, 22:14
von thonix
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

Verfasst: Donnerstag 7. September 2006, 23:10
von BlackJack
Meinst Du das vielleicht so!?

viking.py:

Code: Alles auswählen

class Viking(object):
    def conquer(self, land):
        pass

eric = Viking()
other.py:

Code: Alles auswählen

import viking
viking.eric.conquer('Sylt')
Wenn nicht, dann erkläre mal bitte etwas genauer was Du machen möchtest.

Verfasst: Freitag 8. September 2006, 21:05
von thonix
So funktionier es.
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
main.py:

Code: Alles auswählen

import viking
eric = viking.Viking()
???.eric.conquer('Sylt')
Geht das ?

Verfasst: Freitag 8. September 2006, 21:18
von Joghurt
Natürlich. Mit

Code: Alles auswählen

eric.conquer("sylt")

Verfasst: Freitag 8. September 2006, 21:26
von thonix
Oh sorry habe noch was vergessen - so geht es klar :lol:

Die main.py sieht wie folgt aus:

main.py:

Code: Alles auswählen


import viking
eric = viking.Viking()

def gibmir():
   ???.eric.conquer('Sylt')
So geht es ned ....

Verfasst: Freitag 8. September 2006, 21:29
von Joghurt

Code: Alles auswählen

def gibmir():
  global eric
  eric.conquer(..)
globals sind aber sehr schlechter Programmierstil.

bitte nicht schlagen

Verfasst: Freitag 8. September 2006, 21:31
von Witwe_Bolte
was sollen denn die ???
Warum muß er denn eric global deklarieren, wenn eric in main.py instanziert wird?

Verfasst: Freitag 8. September 2006, 21:48
von thonix
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 ?

Tscha

Verfasst: Freitag 8. September 2006, 22:20
von Witwe_Bolte
Ich hab jetzt Dein Beispiel bei mir durchlaufen lassen. Was soll ich sagen? Keine Probs.

Verfasst: Samstag 9. September 2006, 09:38
von Rebecca
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)
Immer alles, was du in einer Funktion brauchst, als Parameter mit uebergeben.

Verfasst: Samstag 9. September 2006, 11:47
von BlackJack
thonix hat geschrieben:So funktionier es.
Ich würde aber gerne die Instanzierung nicht in der getrennten Datei machen sondern in der Haupt Datei
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.

Beschreib doch mal was Du machen möchtest. Also nicht aus Sicht einer Lösung sondern allgemein das Problem.

Verfasst: Samstag 9. September 2006, 15:03
von birkenfeld
Rebecca hat geschrieben:
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)
Immer alles, was du in einer Funktion brauchst, als Parameter mit uebergeben.
Für geschachtelte Funktionen gilt das schonmal nicht allgemein. Nicht umsonst unterstützt Python closures.

Auch bei Funktionen auf Modullevel kann man doch ohne Probleme auf Modulvariablen zugreifen; solange man sie nicht neu bindet auch ohne "global".

Verfasst: Montag 11. September 2006, 10:37
von thonix
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...

Verfasst: Montag 11. September 2006, 11:34
von BlackJack
thonix hat geschrieben:Daher dachte ich das ganze in eine Klasse zu packen...
Keine schlechte Idee. Das könnte man zum Beispiel so umsetzen (ungetestet):

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()
main.py:

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!
other.py:

Code: Alles auswählen

import eric

def function_with_too_long_name():
    eric.conquer('Sweden')
Nebenbei: ``if`` ist keine Funktion sondern eine Anweisung.