Seite 1 von 2
von klasse A auf instanz klasse B zugreifen?
Verfasst: Mittwoch 17. Februar 2010, 15:15
von draufunddran
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
Verfasst: Mittwoch 17. Februar 2010, 15:36
von Deadman44
"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.
Verfasst: Mittwoch 17. Februar 2010, 15:39
von draufunddran
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.
Verfasst: Mittwoch 17. Februar 2010, 15:56
von cofi
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 ...
Verfasst: Mittwoch 17. Februar 2010, 16:04
von draufunddran
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...
Verfasst: Mittwoch 17. Februar 2010, 16:12
von numerix
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.
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:aber wenn ihr wollte poste ich gerne den ganzen code...
Aber dann bitte auslagern!
Verfasst: Mittwoch 17. Februar 2010, 16:16
von draufunddran
also bis jetzt sind es ca. 400 aber es werden mit sicherheit noch ca. 1000 dazu kommen.
Verfasst: Mittwoch 17. Februar 2010, 16:19
von CM
Einfach in diesen Pastebin:
http://paste.pocoo.org/
"Python" einstellen und den Link hier posten.
HTH
Christian
Verfasst: Mittwoch 17. Februar 2010, 16:28
von draufunddran
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

Verfasst: Mittwoch 17. Februar 2010, 19:09
von BlackJack
@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.
Verfasst: Mittwoch 17. Februar 2010, 19:57
von draufunddran
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
Verfasst: Mittwoch 17. Februar 2010, 23:44
von BlackJack
@draufunddran: `base` als Argument beim Erstellen der GUI übergeben!?
Verfasst: Donnerstag 18. Februar 2010, 11:40
von draufunddran
ich hab die zwei instanzen jetzt beim erstellen der gui instanz übergeben aber es geht trotzdem nicht.
Beim erstellen:
und in der klasse selber:
Code: Alles auswählen
class Appgui:
def __init__(self, master, base, rover):
immer noch der selbe fehler...
Verfasst: Donnerstag 18. Februar 2010, 11:46
von cofi
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.
Verfasst: Donnerstag 18. Februar 2010, 18:24
von draufunddran
Code: Alles auswählen
def __init__(self, master, base, rover):
self.started = False
self.base = base
self.rover = rover
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...
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
Verfasst: Donnerstag 18. Februar 2010, 19:02
von EyDu
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...
Das ist der richtige Weg. Du hast wahrscheinlich das Prinzip von Klassen und OOP nur noch nicht verstanden.
Sebastian
Verfasst: Donnerstag 18. Februar 2010, 21:24
von ...
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...
Verfasst: Freitag 19. Februar 2010, 00:45
von EyDu
... 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...
Hallo!
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
Verfasst: Freitag 19. Februar 2010, 00:55
von ...
Jup - das ist besser

Verfasst: Freitag 19. Februar 2010, 12:26
von draufunddran
gut vielen dank...
ich werd mir die tuts und kapitel zu OOP wohl noch mehrmals durchlesen müssen!
Trotzdem nochmal vielen Dank