Ich persönlich benutze Schnittstellen sehr oft in Verbindung mit der Zope Component Architecture (ZCA). Der Vorteil ist nicht so sehr, Schnittstellen zu haben, sondern diese mit Adaptern und Utilities (Singletons) nutzen zu können.
z. Sie könnten einen Adapter erstellen, der eine Klasse übernehmen kann, die ISomething implementiert, aber sie an die Schnittstelle ISomethingElse anpasst. Im Grunde ist es ein Wrapper.
würde die ursprüngliche Klasse sein:
class MyClass(object):
implements(ISomething)
def do_something(self):
return "foo"
Dann Schnittstelle vorstellen ISomethingElse ein Verfahren do_something_else hat(). Ein Adapter könnte wie folgt aussehen:
class SomethingElseAdapter(object):
implements(ISomethingElse)
adapts(ISomething)
def __init__(self, context):
self.context = context
def do_something_else():
return self.context.do_something()+"bar"
Sie würden dann diesen Adapter mit der Komponente Registry registrieren und Sie können es dann wie folgt verwenden:
>>> obj = MyClass()
>>> print obj.do_something()
"foo"
>>> adapter = ISomethingElse(obj)
>>> print adapter.do_something_else()
"foobar"
Was das gibt Ihnen die Möglichkeit, die verlängern ursprüngliche Klasse mit Funktionalität, die die Klasse nicht direkt bereitstellt. Sie können dies tun, ohne diese Klasse zu ändern (es könnte sich in einem anderen Produkt/einer anderen Bibliothek befinden), und Sie könnten diesen Adapter einfach durch eine andere Implementierung austauschen, ohne den Code zu ändern, der ihn verwendet. Es ist alles durch die Registrierung von Komponenten in der Initialisierungszeit getan.
Dies ist natürlich vor allem nützlich für Frameworks/Bibliotheken.
Ich denke, es braucht etwas Zeit, um sich daran zu gewöhnen, aber ich will wirklich nicht mehr ohne leben. Aber wie gesagt, es ist auch richtig, dass Sie genau überlegen müssen, wo es Sinn macht und wo nicht. Natürlich können Schnittstellen auch als Dokumentation der API nützlich sein. Es ist auch nützlich für Komponententests, in denen Sie testen können, ob Ihre Klasse diese Schnittstelle tatsächlich implementiert. Und last but not least schreibe ich gerne die Benutzeroberfläche und einige Doc-Tests, um die Idee zu bekommen, was ich eigentlich programmieren möchte.
Für weitere Informationen können Sie meine little introduction to it auschecken und es gibt eine quite extensive description of it's API.
"erfordert, dass die Methode überschrieben werden muss": aber Sie können ISomething() aufrufen. Some_other_method() – Miles
Scheint mir nicht sehr Pythonic. –