Globale Variablen in mehreren Dateien benutzen?

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
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

Dienstag 31. Oktober 2006, 15:08

Hi zusammen,

ich habe ein (Verständnis)Problem mit globalen Variablen:

Momentan habe ich zwei Klassen in einer Datei. Beide Klassen greifen auf eine globale Variable zu

Code: Alles auswählen

class A(object):
    global tolleVariable

    ... usw



class B(object):
    global tolleVariable

    ... usw


tolleVariable = 0
a = A()
b = B()
Das funktioniert problemlos so.

Die Klassen sind aber etwas gewachsen und zur Übersichtlichkeit möchte sie in zwei verschienene Dateien packen und in einer dritten Datei folgendes machen:

Code: Alles auswählen

import a, b

tolleVariable = 0
a.a = A()
b.b = B()
Jetzt schreit allerdings der Interpreter beim ersten Vorkommen von tolleVariable in Klasse a, dass er die nicht kennt.

Kann man dem abhelfen, oder muss man das dann irgendwie anderst lösen?

Danke für eure Mühe!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 31. Oktober 2006, 15:26

Das liegt daran, dass Variablen nur modulglobal sein können. Am besten du vergisst nun dass es sowas wie global überhaupt gibt und überlegst dir wie man sowas "sauber" implementieren kann, d.h. ohne die Verwendung von global.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Dienstag 31. Oktober 2006, 15:28

Hilfe ist einfach: Keine globalen Variablen benutzen.

Einfach die Variable übergeben, und dann auch zurück geben... (kann __init__ was zurück geben?)

Code: Alles auswählen

class A(object):
    def __init__(self, tolleVariable):
        usw
        return tolleVariable



class B(object):
    def __init__(self, tolleVariable):
        usw
        return tolleVariable

Code: Alles auswählen

import a, b

tolleVariable = 0
a.a = A(tolleVariable)
b.b = B(tolleVariable) 
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 31. Oktober 2006, 15:34

Nirven hat geschrieben:kann __init__ was zurück geben?
Nein! :shock:
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Dienstag 31. Oktober 2006, 16:02

Schade :D
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 31. Oktober 2006, 16:09

Nirven hat geschrieben:Schade :D
Wo sollte der Rückgabewert denn landen?

A() gibt eine Instanz von A zurück, das ist nun mal in Python so.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Dienstag 31. Oktober 2006, 16:22

Ich weiß, zumindestens wenn ich nachdenke...

Hätte es doch funktioniert wäre mein mangelndes Nachdenken nicht aufgefallen. Also Schade :D ;)

Bin wohl doch nicht so multitaskingfähig wie ich dachte.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 31. Oktober 2006, 16:26

Nach dem (indirekten) Aufruf von __init__ erhält man eine Instanz der Klasse zurück, reicht dir das nicht? :)

Für modulglobale Variablen in Multithread-Web-Anwendungen, auf die aus mehreren Modulen zugegriffen werden kann, gibt es u.a. im Paste-Paket mit paste.registry Abhilfe.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 31. Oktober 2006, 17:36

Nirven hat geschrieben:Einfach die Variable übergeben, und dann auch zurück geben... (kann __init__ was zurück geben?)
Warum nicht eine Methode aufrufen und den Rückgabewert da erhalten? Also so:

Code: Alles auswählen

class A(object):
    def __init__(self, tolleVariable):
        self.tolleVariable = tolleVariable

    def tuwas(self):
        ...
        return self.tolleVariable

a = A("blabla")
b = a.tuwas()
print b

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten