Klassenmethode aus anderer Datei aufrufen

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
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

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!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
snafu
User
Beiträge: 6881
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:

Code: Alles auswählen

>>> t = TestClass()
>>> t.test_func()
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

@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.
Bottle: Micro Web Framework + Development Blog
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

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!
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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 ;)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

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 ;-)?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.).
Zuletzt geändert von Darii am Mittwoch 9. Dezember 2009, 12:51, insgesamt 1-mal geändert.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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.
Antworten