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.
Python Interface ähnlich wie Java?
- 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:
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.
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
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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@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.
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.

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]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ja, Interfaces in Java machen im Grunde das gleiche. In Python kann man sich da der Mehrfachvererbung bedienen.B-Baer hat geschrieben:Ich sehe das aber richtig, dein Lösungsansatz ist eine Ableitung?!
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.
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.
@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.
Vergiss also die Idee, etwas erzwingen zu wollen. Dokumentiere die Schnittstelle stattdessen, und erstelle vielleicht noch eine ABC, die das Protokoll definiert. Das reicht.
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.
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.
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.
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.
@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.
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.
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
Habe noch ein weiteres Beispiel gefunden:
http://trac.puremvc.org/PureMVC_Python
@proofy: In wiefern ist "@staticmethod" denn eine „Schönheitsmaßnahme“? "staticmethod()" und "classmethod()" dienen durchaus einem bestimmten Zweck, und nicht lediglich zur Dekoration.
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
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

- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Eh. Es sind zwar Decorator, aber das ist anders gemeintproofy hat geschrieben:Das stimmt natürlich, sieht meiner Meinung nach aber auch sehr schön aus, es über die Methode zu schreiben.

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?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?
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@proofy: Es sind auch keine Deklarationen. Davon gibt es Python nur ganz wenige: "coding comment", ``global``, ``nonlocal`` (Python 3), und ``from __future__``-Importe.