Seite 1 von 1

interface

Verfasst: Mittwoch 16. September 2009, 10:45
von kostonstyle
hallo miteinander
kann man in python eigenen Interfaces programmieren? Warum benutzt man immer noch häufig die Python Version 2.6 anstatt 3?

Re: interface

Verfasst: Mittwoch 16. September 2009, 10:49
von Hyperion
kostonstyle hat geschrieben:hallo miteinander
kann man in python eigenen Interfaces programmieren? Warum benutzt man immer noch häufig die Python Version 2.6 anstatt 3?
Was verstehst Du unter einem "Interface"?
Edit: Ok, habe mal das PEP 245 überflogen :-)

Es gibt hier viele Threads zu Thema 2.x vs. 3 - lies die Dir einfach mal durch (aktuell ist da grad auch einer im Unterforum Web und Netzwerk).

Verfasst: Mittwoch 16. September 2009, 10:51
von CM
ad 1) Ja, klar.
ad 2) Weil noch recht wenige Module nach 3.x portiert sind (außerhalb der Standardlibrary).

edit: Zu langsam ... (Als Interface fasse ich z. B. GUIs, CLIs, web-interfaces auf.)

Verfasst: Mittwoch 16. September 2009, 11:14
von sma
In Python macht man Interface-Typen, wie man sie z.B. in Java kennt selten explizit sondern lässt sie implizit als Teil der Dokumentation entstehen ("muss wie ein `dict` funktionieren", "ist `file`-artig").

Python kann dafür seine Mehrfachvererbung für Mixins a.k.a. Traits, wie man sie z.B. in Scala (oder Ruby oder Smalltalk oder Fortress) findet, einsetzen. Das ist das eigentlich mächtigere Konzept - sieht man einmal von dem Fehlen statischer Typen ab.

In Python 3 kann man sich seine Typprüfungen selbst bauen, wenn man möchte, da die Sprache es zulässt, dass man `def a(x: int, y: int) -> int: return x+y` schreibt. Nun kann man sich `a.__annotations__` anschauen und dort die Objekte lesen, wie man stellvertretend für Typen benutzt hat (ich habe das Klassenexemplar `int` benutzt) und Dinge und Sachen damit anstellen.

Stefan

Verfasst: Mittwoch 16. September 2009, 12:39
von Leonidas
In Python 2.x könnte man mit Dekoratoren auch Typprüfungen machen, wo die gewünschten Typen einfach dem Dekorator übergeben werden und der vor dem Aufruf der Funktion prüft und nach dem Aufruf den Rückgabewert betrachtet. Ist natürlich nicht statisch, aber das wären die Annotations auch nicht.

Verfasst: Mittwoch 16. September 2009, 14:00
von kostonstyle
das frage ich mich auch immer, warum Python die Mehrfachvererbung erlaubt, das wäre Interface schon viel eleganter. Oder nicht?

Verfasst: Mittwoch 16. September 2009, 14:09
von cofi
Und warum willst du von denen erben? Man braucht die Typen nicht, sondern Python reicht es, wenn die Objekte sich so verhalten wie der gewuenschte Typ.

Da du das Protokoll sowieso implementieren musst, verkommt das erben von einem Interface zu Clutter.

Verfasst: Mittwoch 16. September 2009, 19:32
von Leonidas
kostonstyle hat geschrieben:das frage ich mich auch immer, warum Python die Mehrfachvererbung erlaubt, das wäre Interface schon viel eleganter.
Wieso wäre es denn eleganter?

Verfasst: Mittwoch 16. September 2009, 20:35
von sma
kostonstyle hat geschrieben:das frage ich mich auch immer, warum Python die Mehrfachvererbung erlaubt, das wäre Interface schon viel eleganter. Oder nicht?
Ein wäre es nicht. Denn es sind zwei verschiedene Dinge. Interfaces (a la Java) beschreiben *Typen*. Das ist etwas anderes als *Klassen*. Diese implementieren, welche Methoden ihren Exemplaren zur Verfügung stehen. Eine Klasse ist also eigentlich nicht mehr als ein Satz von Methoden. Wenn ich diese jetzt zu neuen Klassen flexibel kombinieren kann, das ist das etwas, das ich zwar mit Interfaces beschreiben, nicht aber *implementieren* kann.

Stefan