Python Namensraum

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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
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.
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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 ?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Natürlich. Mit

Code: Alles auswählen

eric.conquer("sylt")
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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 ....
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Code: Alles auswählen

def gibmir():
  global eric
  eric.conquer(..)
globals sind aber sehr schlechter Programmierstil.
Witwe_Bolte
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?
unsensibel aber empfindlich
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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 ?
Witwe_Bolte
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
Benutzeravatar
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)
Immer alles, was du in einer Funktion brauchst, als Parameter mit uebergeben.
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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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".
thonix
User
Beiträge: 47
Registriert: Samstag 12. August 2006, 00:06

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...
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.
Antworten