hallo,
ich hab mal wieder ein Problem.
Ich habe eine Datei mit einer Klasse A und eine Datei mit einer Klasse B. Beide importiere ich mit "from .... import *" in eine dritte Datei dort erzeuge ich eine instanz jeder Klasse (a und b) wie kann ich jetzt innerhalb der Instanz a auf b zugreifen? bei mir kommt immer "NameError" global name 'testvar' is not defined.
Kann mir einer helfen?
greetz draufunddran
von klasse A auf instanz klasse B zugreifen?
"global" ist die Lösung für dein Problem.
Du deklarierst die Klasseninstanzen einfach als gloable Variablen. Dann solltest du normalerweise darauf zugreifen können. Konnte es jetzt aber mangelns nicht installierten Python jetzt nicht testen.
Du deklarierst die Klasseninstanzen einfach als gloable Variablen. Dann solltest du normalerweise darauf zugreifen können. Konnte es jetzt aber mangelns nicht installierten Python jetzt nicht testen.
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
an global hab ich auch schon gedacht aber ich weis nicht wo. ich hab es schon in der klasse a versucht aber es kommt der gleiche fehler.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nein `global` ist _keine_ Loesung. Das ist sie in 99,99999% der Faellen nicht.
Wenn deine Instanz `A`, die Instanz `B` benoetigt, uebergibst du B am besten an A, ueber `__init__` oder andere Funktionen.
ABER: Rueck raus mit dem was du eigentlich willst, wenn du nur auf einzelne Namen zugreifen willst ist das ein Code Smell.
Und vor allem zeig mal den Code, da ist IMHO mehr kaputt.
Und Finger weg von *-importen ...
Wenn deine Instanz `A`, die Instanz `B` benoetigt, uebergibst du B am besten an A, ueber `__init__` oder andere Funktionen.
ABER: Rueck raus mit dem was du eigentlich willst, wenn du nur auf einzelne Namen zugreifen willst ist das ein Code Smell.
Und vor allem zeig mal den Code, da ist IMHO mehr kaputt.
Und Finger weg von *-importen ...
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
Also es geht eben wieder um mein GPS Programm, ich hab eine GUI klasse und eine RECEIVER klasse nun will ich über einen Button aus der GUI klasse eine Methode der RECEIVER klasse starten.
Wenn ich alle Klassen in eine Datei packe geht es ja, ich wollte es nur übersichtlicher und hab sie in mehere Dateien getrennt.
ich hoffe das hilft euch weiter mir zu helfen
aber wenn ihr wollte poste ich gerne den ganzen code...
Wenn ich alle Klassen in eine Datei packe geht es ja, ich wollte es nur übersichtlicher und hab sie in mehere Dateien getrennt.
ich hoffe das hilft euch weiter mir zu helfen
aber wenn ihr wollte poste ich gerne den ganzen code...
Ich weiß ja nicht, um welche Größenordnungen es hier geht, aber wenn es nicht einige tausend Zeilen Code sind, dann kann man das bei guter Strukturierung und Kommentierung noch ganz gut in eine einzelne Datei packen.draufunddran hat geschrieben:Also es geht eben wieder um mein GPS Programm, ich hab eine GUI klasse und eine RECEIVER klasse nun will ich über einen Button aus der GUI klasse eine Methode der RECEIVER klasse starten.
Wenn ich alle Klassen in eine Datei packe geht es ja, ich wollte es nur übersichtlicher und hab sie in mehere Dateien getrennt.
Aber dann bitte auslagern!draufunddran hat geschrieben:aber wenn ihr wollte poste ich gerne den ganzen code...
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
also bis jetzt sind es ca. 400 aber es werden mit sicherheit noch ca. 1000 dazu kommen.
Einfach in diesen Pastebin:
http://paste.pocoo.org/
"Python" einstellen und den Link hier posten.
HTH
Christian
http://paste.pocoo.org/
"Python" einstellen und den Link hier posten.
HTH
Christian
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
Hier der code:
main.py: http://paste.pocoo.org/show/179311/
receive.py: http://paste.pocoo.org/show/179312/
dgps.py: http://paste.pocoo.org/show/179314/
gui.py: http://paste.pocoo.org/show/179315/
Also der Fehler kommt wenn ich den Start/Stop Button drücke der dann die Methode base.start(0) aufrufen soll und "base" ist angeblich nicht definiert.
wenn ich alles in eine Datei packe geht es, warum nicht wenn ich sie trenne?
aber wie gesagt, es is ja noch nicht fertig also nicht alles hinterfragen
main.py: http://paste.pocoo.org/show/179311/
receive.py: http://paste.pocoo.org/show/179312/
dgps.py: http://paste.pocoo.org/show/179314/
gui.py: http://paste.pocoo.org/show/179315/
Also der Fehler kommt wenn ich den Start/Stop Button drücke der dann die Methode base.start(0) aufrufen soll und "base" ist angeblich nicht definiert.
wenn ich alles in eine Datei packe geht es, warum nicht wenn ich sie trenne?
aber wie gesagt, es is ja noch nicht fertig also nicht alles hinterfragen
@draufunddran: In der `gui.py` wird ziemlich weit unten auf `base` zugegriffen, aber der Name wird weder von irgendwoher importiert noch in dem Modul an einen Namen gebunden. Darum kennt Python den da nicht.
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
Ich dachte da ich die GUI.py in der main.py importiere kennt sie dann die instanz base. Hat Mir einer ne lösung dazu?
Greetz draufunddran
Greetz draufunddran
Zuletzt geändert von draufunddran am Donnerstag 18. Februar 2010, 11:36, insgesamt 1-mal geändert.
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
ich hab die zwei instanzen jetzt beim erstellen der gui instanz übergeben aber es geht trotzdem nicht.
Beim erstellen:
und in der klasse selber:
immer noch der selbe fehler...
Beim erstellen:
Code: Alles auswählen
gui = Appgui(root, base, rover)
Code: Alles auswählen
class Appgui:
def __init__(self, master, base, rover):
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Dann zeig mal den Rest von ``__init__``. Aber lass mich erstmal raten: Du speicherst `base` nicht als Instanzattribut?
``__init__`` ist keine magische Namenimportsmaschine, sondern eine einfache Methode.
``__init__`` ist keine magische Namenimportsmaschine, sondern eine einfache Methode.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
Code: Alles auswählen
def __init__(self, master, base, rover):
self.started = False
self.base = base
self.rover = rover
So kann ich ja jetzt auch nur über self.base zugreifen...
Ich werd jetzt alles in eine Datei packen, da das Programm nächste Woche fertig sein sollte und gewiss noch andere probleme auf mich warten...
Danke für eure hilfe, wenn jemand ne elegante Lösung kennt wär ich trotzdem nicht abgeneigt.
draufunddran
Das ist der richtige Weg. Du hast wahrscheinlich das Prinzip von Klassen und OOP nur noch nicht verstanden.draufunddran hat geschrieben:der Rest sieht so aus, aber das ist ja auch keine Lösung, oder ist das der einzige weg?
So kann ich ja jetzt auch nur über self.base zugreifen...
Sebastian
Das Leben ist wie ein Tennisball.
Wenn du viele Variablen benötigst, das sie den Aufruf sprengen würden, kannst du ja auch Standarts definieren, und diese dann etweder per keywords oder per instanz.variablennamen ändern.
Im letzten Fall musst du möglicherweise halt das noch Aktualisieren, in dem du die Funktionen nochmal aufrufst...
Im letzten Fall musst du möglicherweise halt das noch Aktualisieren, in dem du die Funktionen nochmal aufrufst...
Hallo!... hat geschrieben:Wenn du viele Variablen benötigst, das sie den Aufruf sprengen würden, kannst du ja auch Standarts definieren, und diese dann etweder per keywords oder per instanz.variablennamen ändern.
Im letzten Fall musst du möglicherweise halt das noch Aktualisieren, in dem du die Funktionen nochmal aufrufst...
Per Keyword oder als einfaches Argument ist es in den meisten fällen schöner einen default-Wert zu überschreiben (es heißt übrigens Standard), da man so am wenigsten vergisst. Anders hat man außerdem leicht sehr viel wiederholenden Code. Wenn du schon Attribute von außen setzt und diese andere Eigenschaften des Exemplares beeinflussen, dann solltest du dies per Funktion oder, noch besser, über properties machen.
Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
- draufunddran
- User
- Beiträge: 34
- Registriert: Freitag 26. Juni 2009, 13:43
gut vielen dank...
ich werd mir die tuts und kapitel zu OOP wohl noch mehrmals durchlesen müssen!
Trotzdem nochmal vielen Dank
ich werd mir die tuts und kapitel zu OOP wohl noch mehrmals durchlesen müssen!
Trotzdem nochmal vielen Dank