Schnittstelle

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
tomate
User
Beiträge: 48
Registriert: Sonntag 5. August 2007, 12:07

Donnerstag 27. Dezember 2007, 13:03

Hallo,
ich hab einen Algorithmus, der über eine Benutzeroberfläche (wxPython) gestartet werden kann. Ungefähr so

Code: Alles auswählen

                        algo1 = Algo(data)  

                        start_new_thread(algo1.run, ())
Ich würde dem Benutzer gerne verschiedene andere Algorithmen zum Vergleich anbieten. Gibt es eine schöne Möglichkeit, den Code so zu gestalten, dass problemlos neue Algorithmen hinzugefügt werden können?

Ich bin ziemlich sicher, dass es sowas schon im Forum gibt. Hat vielleicht jemand einen Tipp nach was ich suchen könnte? (Interface?)

Danke und Gruß
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 27. Dezember 2007, 15:58

Such mal nach Plugin-System. Du kannst dir auch den Code von "What's On Air" angucken, dort wird ein sehr simples Plugin-System implementiert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
tomate
User
Beiträge: 48
Registriert: Sonntag 5. August 2007, 12:07

Donnerstag 27. Dezember 2007, 17:08

Ok, Danke.

Es muss aber nicht mal ein Plugin sein. Ich will mir damit einfach selber die Arbeit ersparen, falls ich später nochmal was hinzufügen möchte.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Donnerstag 27. Dezember 2007, 19:46

In Python musst du keine Interfaces schreiben - das ist auf Grund des Ducktypings überflüssig. Was ich teilweise mache ich eine Default Implementierung zur Dokumentation zu schreiben.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Freitag 28. Dezember 2007, 12:13

tomate, die einzige Bedingung, die an ein Ding, welches anstelle von "algo1" stehen kannst, deinem Beispiel nach gestellt wird, ist, eine Methode "run()" zu haben. Damit hast du dein Interface identifiziert und formaler wird's in Python nicht.

Wenn du willst, kannst du dir ja die folgenden Klasse definieren und verlangen, dass jeder, der mitspielen möchte, von dieser Klasse erbt. Halte ich aber außer aus erzieherischen Gründen (und zur expliziten Dokumentation) für unnötig ;)

Code: Alles auswählen

class IAlgo(object):
    def run(self):
    raise Exception("implementing classes must override this method")
PS: Einige Python-Anwendungen wie z.B. Zope formalisieren ein ähnliches Vorgehen da explizite Schnittstellenbeschreibungen schon einen Wert haben.

Stefan
tomate
User
Beiträge: 48
Registriert: Sonntag 5. August 2007, 12:07

Freitag 28. Dezember 2007, 22:50

Danke für die Antworten
Antworten