Statische Methoden

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
baracuda
User
Beiträge: 21
Registriert: Mittwoch 5. November 2008, 13:08

Hi,

ich habe mir einen kleinen Texteditor mit FTP-Unterstützung geschrieben, aber als UI-Toolkit noch Tkinter verwendet. Deshalb möchte ich jetzt auf GTK umsteigen, da ich mittlerweile auf einer Linux-Kiste arbeite.
Aber zum eigentlichen Problem: Im Zuge desssen habe ich auch gleich den Code optimiert, auch einiges in eigene Module ausgelagert. Jetzt habe ich eine Methode in einem Modul, dass Text in das Textfeld in der Hauptklasse einfügen soll.
Da es etwas kompliziert wäre, dass im Detail zu beschreiben, habe ich ein Beispiel gemacht, dass demonstriert, wie es später ablaufen soll:

Code: Alles auswählen

import pygtk
pygtk.require("2.0")
import gtk

class editor_app:
	def __init__(self):
		self.w = gtk.Window()
		self.w.set_title("UI Test")
		self.w.set_size_request(300, 300)
		self.w.set_border_width(40)
		
		self.textview = gtk.TextView()
		self.w.add(self.textview)
		
		self.w.connect("destroy", gtk.main_quit)
		self.w.show_all()
	
	def insert_text(self, t):
		b = self.textview.get_buffer()
		b.set_text(t)
		
	def main(self):
		gtk.main()
	
	insert_text = staticmethod(insert_text)

class other_class:
	def __init__(self):
		editor_app.insert_text("Hello world!")
		
a = editor_app()
b = other_class()
a.main()
Ich habe auch schon im Internet nachgelesen, wie das funktionieren soll, aber trotzdem wirft der Code nur Fehler, egal was ich auch probiere:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 32, in <module>
    b = other_class()
  File "test.py", line 29, in __init__
    editor_app.insert_text("Hello world!")
TypeError: insert_text() takes exactly 2 arguments (1 given)
Ich beziehe mich dabei auf http://www.rexx.com/~dkuhlman/python_10 ... n_101.html Absatz "2.5.2.4 Static methods and class methods ".
Im übrigen nutze ich python 2.5.2 .

Danke im Voraus
baracuda

PS: wie schon angedeutet: verkompliziert es dass Problem, wenn editor_app die andere Klasse als Modul importiert?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du solltest die Zeile

Code: Alles auswählen

insert_text = staticmethod(insert_text)
löschen.

Statische Methoden gehören nicht zu einer Instanz, sondern zu einer Klasse. Innerhalb von insert_text verwendest du allerdings "self", also möchtest du die Instanz verändern.
Das Leben ist wie ein Tennisball.
baracuda
User
Beiträge: 21
Registriert: Mittwoch 5. November 2008, 13:08

Irgendeine Idee, wie man so eine Problemstellung lösen könnte?
pcos
User
Beiträge: 16
Registriert: Dienstag 3. April 2007, 14:21

Hallo,

was ist denn genau die Problemstellung? Warum soll insert_text statisch sein? Wie EyDu schon geschrieben hat, macht insert_text nur bei einer Instanz (mit Attribut textview) Sinn. Deshalb macht es auch keinen Sinn, in other_class.__init__ die Methode insert_text ohne eine Instanz aufzurufen. Warum fügst Du nicht einfach a.insert_text("Hello world!") in Zeile 33 ein, nachdem du eine Instanz von editor_app erstellt hast?
Wenn du das in eine Klasse other_class verlagern willst, solltest du der Klasseninstanz (z.B. in __init__) die auf Modelebene erstellte Instanz a übergeben. In Deinem (kurzen) Beispiel sehe ich aber nicht, wieso man dafür eine Klasse braucht; wahrscheinlich würde eine Funktion "start_editor" o.ä. ausreichen.
baracuda
User
Beiträge: 21
Registriert: Mittwoch 5. November 2008, 13:08

Die Problemstellungen ist einfach, dass ich einen Teil des Codes in eine andere Klasse auslagern möchte.

Leider gestaltet sich die Kommunikation zwischen den Klassen nicht so einfach wie gedacht.

Konkret heisst das, das eine andere Klasse Text in ein Fenster einfügen soll, dass in der Hauptklasse definiert ist.

lg baracuda
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Aber eine statische Methode macht hier überhaupt keinen Sinn! Wie pcos schon geschrieben hat, musst du die Instanz per Parameter an die andere Klasse weitergeben. Wenn das aus irgend einem Grund bei dir nicht möglich ist, dann ist das Design Mist ;-)
Das Leben ist wie ein Tennisball.
Antworten