Seite 1 von 1
Klassenmethode aus anderer Datei aufrufen
Verfasst: Mittwoch 9. Dezember 2009, 08:42
von sylenz
Guten Morgen,
folgendes (vermutlich recht triviales

) Problem:
Ich habe in einer Datei testclass.py eine Klasse (z.B. testclass) mit unterschiedlichen Methoden (z.B. testfunc).
Nun importiere ich in meine hauptdatei meine Klassendatei (import testclass).
Wie kann ich nun aber auf die Funktionen einer solchen zugreifen?
Meine Versuche mit testclass.testclass.testfunc() schlugen leider fehl,
die Methode der Klasse habe ich als @staticmethod definiert, insofern müsste ich ja auch nicht erst eine Instanz der Klasse erzeugen oder?
Bin gerade ziemlich verwirrt, und über jeden Tip äußerst dankbar

guten Start in den Tag!
Re: Klassenmethode aus anderer Datei aufrufen
Verfasst: Mittwoch 9. Dezember 2009, 09:09
von Darii
sylenz hat geschrieben:Meine Versuche mit testclass.testclass.testfunc() schlugen leider fehl,
die Methode der Klasse habe ich als @staticmethod definiert, insofern müsste ich ja auch nicht erst eine Instanz der Klasse erzeugen oder?
Keine Ahnung, ich bezweifle stark, dass „schlug fehl“ die Fehlermeldung war.
Abgesehen davon, warum benutzt du überhaupt eine Klasse? Statt einer statischen Methode (was etwas anderes als eine Klassenmethode ist) reicht meistens auch eine normale Funktion auf Modulebene.
Verfasst: Mittwoch 9. Dezember 2009, 09:26
von snafu
Code: Alles auswählen
>>> class TestClass(object):
... def test_func(self):
... return 'test'
...
>>> TestClass.test_func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method test_func() must be called with TestClass instance as first argument (got nothing instead)
>>> TestClass().test_func()
'test'
Du musst also - wie die Fehlermeldung schon sagt - zunächst ein Exemplar (Instance) deiner Klasse erzeugen und kannst dann deine Methode aufrufen. Idealerweise bindet man das Exemplar an einen Namen, da man ja meist verschiedene Dinge damit machen will:
Verfasst: Mittwoch 9. Dezember 2009, 09:41
von Defnull
@snafu: Sylenz hat doch von einer statischen Methode geredet. Das funktioniert wunderbar.
Code: Alles auswählen
>>> class TestClass(object):
... @staticmethod
... def test_func():
... return 'test'
...
>>> TestClass.test_func()
'test'
@sylenz: Trotzdem wäre die Fehlermeldung hilfreich.
Verfasst: Mittwoch 9. Dezember 2009, 11:21
von sylenz
Wow, ok danke schonmal für das rasche Feedback!
Genau, ich bentze eine statische Methode, insofern fällt das erzeugen einer Instanz weg.
Da ich gerade auf Bug-Suche in einem schon vorhanden script bin, wollte ich die statische Methode auch weiterhin verwenden und das ganze nicht in eine sperate Funktion auslagern.
In meiner Ursprungsfrage ging es eigentlich nur darum, ob syntaktisch so alles OK ist, oder ob durch grobe Schnitzer das gar nicht laufen kann.
Inzwischen habe ich mir mal ein Testscript geschrieben, indem das includieren der Klasse + Aufruf der Methode funktioniert.
Wirklich weiter bringt mich das aber trotzdem nicht, das kuriose ist, dass das (richtige) Programm genau bis zu dem Funktionsaufruf läuft und an diesem dann Sang und Klanglos die weitere Verarbeitung des Codes einstellt.
Es ist dabei egal, ob ich den Aufruf am Anfang, Ende oder Mitten in den Code schmeiße, auch evtl. abgefangene Exceptions sollten so eigetnlich nicht unterdrückt werden :-/.
Kann mir irgendjemand einen guten Debugger empfehlen? Dass es überhaupt an dem Funktionsaufruf liegen muss habe ich nur durch verteilen von verstreuten Dummy-Ausgaben hinbekommen (Ausgabe vor Funktionsaufruf: Geht, Ausgabe danach : Nicht, Aufruf auskommentieren: Beide gehen)
Sehr seltsam alles und ohne Sourcecode auch für euch vermutlich nicht zu knacken ... trotzdem danke für die vielen Gedanken und Anregungen!
Verfasst: Mittwoch 9. Dezember 2009, 11:43
von Pekh
Und was passiert *in* der Methode? Das erste, was ich machen würde (nach einem intensiven Studium des Tracebacks), wäre, ein paar "print"s oder log.debug's im Code der Methode selbst zu verteilen, um herauszufinden, an welcher Stelle er eigentlich rausspringt.
Verfasst: Mittwoch 9. Dezember 2009, 12:24
von ms4py
Pekh hat geschrieben:Und was passiert *in* der Methode? Das erste, was ich machen würde (nach einem intensiven Studium des Tracebacks), wäre, ein paar "print"s oder log.debug's im Code der Methode selbst zu verteilen, um herauszufinden, an welcher Stelle er eigentlich rausspringt.
Oder einfach einen Debugger verwenden

Verfasst: Mittwoch 9. Dezember 2009, 12:34
von Pekh
ice2k3 hat geschrieben:Pekh hat geschrieben:Und was passiert *in* der Methode? Das erste, was ich machen würde (nach einem intensiven Studium des Tracebacks), wäre, ein paar "print"s oder log.debug's im Code der Methode selbst zu verteilen, um herauszufinden, an welcher Stelle er eigentlich rausspringt.
Oder einfach einen Debugger verwenden

Wenn man keinen Debugger installiert hat, ist 'print' einfacher.
Verfasst: Mittwoch 9. Dezember 2009, 12:42
von sylenz
Traceback?
Die erste Aktion die die Methode ausführt ist eingentlich eine Ausgabe - die aber bereits nicht ankommt - wie gesagt ich seh hier keinen Fehler... bin ich der erste mit einem solchen phänomen

?
Verfasst: Mittwoch 9. Dezember 2009, 12:50
von Darii
sylenz hat geschrieben:... bin ich der erste mit einem solchen phänomen

?
Nein, keine vernünftige Problembeschreibung zu posten ist weit verbreitet. Dazu gehört unter anderem: Fehlermeldungen, Quellcode (aufs Nötigste reduziert, dass man den Fehler noch nachvollziehen kann), und deine genaue Vorgehensweise(was für Programme nutzt du, wie startest du dein Script ect.).
Verfasst: Mittwoch 9. Dezember 2009, 12:50
von Pekh
sylenz hat geschrieben:Traceback?
Die erste Aktion die die Methode ausführt ist eingentlich eine Ausgabe - die aber bereits nicht ankommt - wie gesagt ich seh hier keinen Fehler... bin ich der erste mit einem solchen phänomen

?
Benutzt du ein GUI-Toolkit? wxPython neigt z.B. bei nicht ganz richtigem Umgang dazu, Fehlermeldungen zu verschlucken.
Verfasst: Mittwoch 9. Dezember 2009, 13:09
von sylenz
Ju ich greife auf wxPython zu.
Nun großartig Quelltext kann ich hier schon posten, aber es beschränkt sich wie gesagt darauf, dass ich wie beschrieben eine Statische Methode aus einer anderen Datei aufrufe, und anstatt in die Funktion zu springen wird die kompilierung (ohne sichtbaren Fehler) abgebrochen.
Das tritt übringes auch auf, wenn ich selbst noch eine dummy funktion implementiere die nichts macht, außer einer msgbox auszugeben -> Bis zum Aufruf läuft alles sauber, dann passiert nichts mehr
Verfasst: Mittwoch 9. Dezember 2009, 13:21
von Pekh
Hier mal ein Schnippsel, mit dem ich die Fehler"behandlung" von wxpython austrickse. Hab ich irgendwann mal im wxpython Wiki oder auf der Mailinglist gefunden. Nicht schön, aber anders wollte es nie funktionieren. Auch nicht mit den wxpython-eigenen Fehlerhandlern.
Code: Alles auswählen
import logging
import sys
import traceback
def hook(t, v, tb):
l = traceback.format_exception(t,v, tb)
s = "".join(l)
logging.exception(s)
sys.excepthook = hook
Logging müßtest du dann noch entsprechend anpassen bzw. durch 'print' geeignet ersetzen.