Seite 1 von 1

Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 12:39
von B-Baer
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 12:47
von cofi
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 12:50
von 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. ;-)

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 12:56
von B-Baer
@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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 12:57
von jbs
Worin siehst du denn den Vorteil Java-Inferfaces in Python zu übertragen?

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 13:03
von cofi
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 13:12
von DasIch
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 26. August 2010, 13:34
von 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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 21. April 2011, 13:24
von proofy
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 21. April 2011, 14:00
von Mad-Marty
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.

Re: Python Interface ähnlich wie Java?

Verfasst: Donnerstag 21. April 2011, 14:11
von 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.

Re: Python Interface ähnlich wie Java?

Verfasst: Mittwoch 4. Mai 2011, 11:16
von proofy
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

Re: Python Interface ähnlich wie Java?

Verfasst: Mittwoch 4. Mai 2011, 11:18
von lunar
@proofy: In wiefern ist "@staticmethod" denn eine „Schönheitsmaßnahme“? "staticmethod()" und "classmethod()" dienen durchaus einem bestimmten Zweck, und nicht lediglich zur Dekoration.

Re: Python Interface ähnlich wie Java?

Verfasst: Mittwoch 4. Mai 2011, 11:44
von proofy
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 ;)

Re: Python Interface ähnlich wie Java?

Verfasst: Mittwoch 4. Mai 2011, 13:15
von cofi
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?

Re: Python Interface ähnlich wie Java?

Verfasst: Mittwoch 4. Mai 2011, 14:32
von BlackJack
@proofy: Es sind auch keine Deklarationen. Davon gibt es Python nur ganz wenige: "coding comment", ``global``, ``nonlocal`` (Python 3), und ``from __future__``-Importe.