Python Interface ähnlich wie Java?

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
B-Baer
User
Beiträge: 23
Registriert: Donnerstag 5. August 2010, 11:56

Hallo,

ich versuche gerade in Python ein Interface zu erstellen,
das Interface soll eine ähnliche Funktion wie in Java erfüllen.
Sprich die "Ableitungen" vom Interface werden "gezungen" einige Funktionen zu implementieren.

Ist sowas in Python möglich? wenn ja wie, habe leider keinerlei Beipiele finden können.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein es kann nichts erzwungen werden.
Eine Moeglichkeit waere folgendes:

Code: Alles auswählen

class Foo(object):
    def method(self, bar):
        raise NotImplementedError()
    def method2(self, foo):
        raise NotImplementedError()

class Implementation(Foo):
    pass
Wobei auch hier nichts erzwungen wird und die Methoden anders als hier festgelegt implementiert werden koennen, ohne dass die Fehler ausgeloest werden.

Vielleicht ist auch das `abc` Modul einen Blick wert.

Die Sache ist aber einfach folgende: Interfaces sind Sache der Dokumentation. Und den Programmierer zu etwas zu zwingen ist nicht pythonisch.
BlackJack

@B-Baer: Möglich sicher -- üblich nicht. Du kannst zum Beispiel eine Klasse schreiben bei der die Methoden Dokumentiert sind, aber nur ein ``raise NotImplementedError`` als Implementierung besitzen. Das ist der übliche Weg "abstrakte" Methoden deutlich zu machen.

Ansonsten gäb's noch Zope's Interfaces oder "traits" könnte noch ein vielversprechender Suchbegriff sein.

Du bekommst auf jeden Fall keine Prüfung zur Übersetzungszeit, also musst Du so oder so auf Unit-Tests bauen. Und da fallen nicht implementierte Methoden ziemlich schnell auf -- egal ob man die nun kennzeichnet oder nicht. ;-)
B-Baer
User
Beiträge: 23
Registriert: Donnerstag 5. August 2010, 11:56

@cofi

Schade,...

Ich sehe das aber richtig, dein Lösungsansatz ist eine Ableitung?!
Sprich wenn ich Funktionen aufrufe, die ich nicht zuvor überschrieben habe, wird ein Fehler geworfen.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Worin siehst du denn den Vorteil Java-Inferfaces in Python zu übertragen?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

B-Baer hat geschrieben:Ich sehe das aber richtig, dein Lösungsansatz ist eine Ableitung?!
Ja, Interfaces in Java machen im Grunde das gleiche. In Python kann man sich da der Mehrfachvererbung bedienen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

In Python verwendet man üblicherweise Mixins (schlechtere Traits) oder einfach Klassen mit Methoden die NotImplementedError werfen.

Interfaces speziell machen nur dann wirklich Sinn wenn man sie für Plugins o.ä. nutzt, dass hat dann aber mit dem was man bei Java unter Interface versteht nicht mehr viel zu tun.
lunar

@B-Baer: Interfaces erfüllen auch in Java nicht die Funktion, etwas zu erzwingen. Man kann auch in Java einfach eine UnsupportedOperationException auslösen, wenn man eine Schnittstellenmethode nicht implementieren möchte. Interfaces dienen hauptsächlich dazu, eine Typhierarchie zu erzeugen.

Vergiss also die Idee, etwas erzwingen zu wollen. Dokumentiere die Schnittstelle stattdessen, und erstelle vielleicht noch eine ABC, die das Protokoll definiert. Das reicht.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Ich benutze Interfaces immer gerne als "Vorlagen" und übergeordnete Dokumentation. Bei Python bin ich nun damit reingefallen, dass eine PEP auch mal abgelehnt werden kann:
http://www.python.org/dev/peps/pep-0245/

In Design Patterns http://www.grimm-jaud.de/index.php?opti ... -in-python bin ich dann fündig geworden.

In IronPython könnte man sich aus der .NET Welt der Interfaces bedienen. Aber will man das?
Wahrscheinlich geht das mit Jpython in Javastyle auch.

Was mir jetzt noch fehlt, ist vielleicht ein Decorator, der Methoden als Interfacemethoden deklariert und ggf. Raise NotImplementedError implementiert.
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

IMO sind Interfaces in java keine Dokumentation oder sonst was,
sie sind nur dazu da um der statisch typisierten Sprache den Umgang mit "verhält sich wie" Objekten zu ermöglichen.

Das ist generell in python nicht Notwendig.

Wenn du allerdings ein Pluginsystem o.ä. entwerfen willst, kannst du mit getattr() vorm laden prüfen,
ob die Plugins die Methoden definiert haben die du als notwendig erachtest.
BlackJack

@proofy: Wozu ein Decorator? Geht es Dir um die Position der Information im Quelltext? Denn ansonsten nimmt es sich ja nicht viel ob man den Dekorator in eine Zeile schreibt, oder ob man ein ``raise NotImplementedError`` schreibt.

Ich persönlich schreibe solche Abstrakten Methoden nur wenn in der Klasse auch mindestens eine konkrete Methode vorkommt. Ansonsten kann man die Anforderungen an ein Objekt auch als Text dokumentieren.

Die verlinkte Seite finde ich an einigen Stellen etwas fragwürdig. Der Autor ist mir doch zu stark in statisch typisierten Sprachen verhaftet. Zum Beispiel wird dort, wenn ich das richtig verstehe, das Programmieren gegen Schnittstellen als wesentliches Strukturmittel in Entwurfsmustern mit Interfaces als "Datentyp" gleich gesetzt. Man braucht keine Interfaces in einer Programmiersprache um das umzusetzen. Die werden ja nur in statisch typisierten Sprachen *benötigt*, damit man die konkreten Implementierungen austauschen kann. In Python verwendet man einfach eine andere Implementierung und gut ist.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Ja, es wäre eine reine "Schönheitsmaßnahme ", ähnlich wie @staticmethod, dass man über der Methode sehen kann, dass das ein Interface ist.

Habe noch ein weiteres Beispiel gefunden:
http://trac.puremvc.org/PureMVC_Python
lunar

@proofy: In wiefern ist "@staticmethod" denn eine „Schönheitsmaßnahme“? "staticmethod()" und "classmethod()" dienen durchaus einem bestimmten Zweck, und nicht lediglich zur Dekoration.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Das stimmt natürlich, sieht meiner Meinung nach aber auch sehr schön aus, es über die Methode zu schreiben.
jetzt sehe ich gerade, dass die beiden Deklarationen (http://docs.python.org/library/function ... aticmethod, http://docs.python.org/library/function ... lassmethod) unterschiedliche Aufgaben haben?
Oh je, das ist ja mal wieder etwas für einen neuen Thread ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

proofy hat geschrieben:Das stimmt natürlich, sieht meiner Meinung nach aber auch sehr schön aus, es über die Methode zu schreiben.
Eh. Es sind zwar Decorator, aber das ist anders gemeint ;)
proofy hat geschrieben:jetzt sehe ich gerade, dass die beiden Deklarationen (http://docs.python.org/library/function ... aticmethod, http://docs.python.org/library/function ... lassmethod) unterschiedliche Aufgaben haben?
Ja, `staticmethod`s operieren ohne Kontext, sind also Funktionen; `classmethod`s operieren auf dem Klassenkontext. Warum sollte es auch beide geben, wenn sie dasselbe tun?
BlackJack

@proofy: Es sind auch keine Deklarationen. Davon gibt es Python nur ganz wenige: "coding comment", ``global``, ``nonlocal`` (Python 3), und ``from __future__``-Importe.
Antworten