von klasse A auf instanz klasse B zugreifen?

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.
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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
Deadman44
User
Beiträge: 3
Registriert: Samstag 26. Dezember 2009, 13:40
Kontaktdaten:

"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.
Benutzeravatar
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.
Benutzeravatar
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 ...
Benutzeravatar
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...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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!
Benutzeravatar
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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Einfach in diesen Pastebin:
http://paste.pocoo.org/

"Python" einstellen und den Link hier posten.

HTH
Christian
Benutzeravatar
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 :)
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.
Benutzeravatar
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
Zuletzt geändert von draufunddran am Donnerstag 18. Februar 2010, 11:36, insgesamt 1-mal geändert.
BlackJack

@draufunddran: `base` als Argument beim Erstellen der GUI übergeben!?
Benutzeravatar
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:

Code: Alles auswählen

gui = Appgui(root, base, rover)
und in der klasse selber:

Code: Alles auswählen

class Appgui:
    def __init__(self, master, base, rover):
immer noch der selbe fehler...
Benutzeravatar
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.
Benutzeravatar
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
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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

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...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

... 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
Das Leben ist wie ein Tennisball.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Jup - das ist besser :)
Benutzeravatar
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
Antworten