2017-07-04 3 views
0

Ich habe eine Gruppe von Funktionen, die mir ein gewünschtes Verhalten (Schnittstelle) definieren.Pythonic Weg zur Implementierung der Schnittstelle für Module

Diese Gruppe kann in eine Klasse eingebunden werden, so dass ich das gewünschte Verhalten "durchsetzen" kann (nicht implementierte Fehler werden erhöht).

Aber auf der anderen Seite ist es nicht sehr pythonisch, und die Klasse wäre nur eine Klasse mit einer Reihe von statischen Methoden.

Also wenn ich Module mit Funktionen verwende, kann ich das Modul nicht erzwingen, um alle gewünschten Funktionen zu implementieren.

Irgendwelche Ideen, wie man ein Modul erzwingt, um alle Funktionen zu implementieren, die ich will, ohne es in einer Klasse zu verpacken?

Vielen Dank im Voraus!

+0

Warum müssen Sie etwas erzwingen? Fordern Sie andere auf, eine API zu implementieren? –

+0

Willst du es als Teil einer Fabrik verwenden, so kann andere Teil die App nur das Objekt dynamisch abrufen, und verwenden Sie die gleichen Funktionsnamen für verschiedene Implementierungen – NI6

+0

Warum also die Notwendigkeit, alles durchzusetzen? –

Antwort

0

Eine Lösung ist, dass Ihre Fabrik eine Methode zum "Registrieren" einer Implementierung und eine andere Methode zum "Abrufen" einer bestimmten Implementierung hat. Eine gültige Implementierung wäre ein Objekt mit den erforderlichen Methodennamen.

class MyFactory: 
    def register(self, name, implementation): 
     # check implementation somehow and raise an Exception if it's not valid 
     # insure implementation has all required function names and they are callable 

    def get_implementation(self, name): 
     # returns a previously registered implementation 

Das einzige, was Sie wirklich hier tun ist, dass eine ungültige Implementierung wird eine Ausnahme ausgelöst, wenn Sie es registrieren, anstatt eine Ausnahme zu werfen, wenn Sie es verwenden. Ob sich die Mühe lohnt, ist fraglich. Es gibt unendlich viele Möglichkeiten, wie eine Implementierung fehlschlagen kann, wenn sie verwendet wird, und die Registrierung kann nur die offensichtlichsten von ihnen erfassen (fehlende Funktionsnamen).

Verwandte Themen