Ich versuche eine Bibliothek zu schreiben, die eine beliebige Liste von Serviceaufrufen von mehreren Serviceendpunkten in einem Container registriert. Ich beabsichtige, die Serviceaufrufe in Klassen zu implementieren, die pro Dienst einmal geschrieben werden. Gibt es eine Möglichkeit, die Begrenztheit der Methoden von den Serviceklassen beizubehalten, wenn sie beim Container registriert werden (damit sie weiterhin Zugriff auf die Instanzdaten ihrer eigenen Objektinstanz haben), oder muss ich das ganze Objekt registrieren und dann eine Art schreiben von Pass-Through in der Container-Klasse mit __getattr__
oder einige solche für den Zugriff auf die Methoden im Kontext der Instanz?Ist es möglich, "Grenzen" einer Methode beizubehalten, wenn ich sie als Objekt außerhalb ihrer Klasse übergebe
Behälter:
class ServiceCalls(object):
def __init__(self):
self._service_calls = {}
def register_call(self, name, call):
if name not in self._service_calls:
self._service_calls[name] = call
def __getattr__(self, name):
if name in self._service_calls:
return self._service_calls[name]
Dienstleistungen:
class FooSvc(object):
def __init__(self, endpoint):
self.endpoint = endpoint
def fooize(self, *args, **kwargs):
#call fooize service call with args/kwargs utilizing self.endpoint
def fooify(self, *args, **kwargs):
#call fooify service call with args/kwargs utilizing self.endpoint
class BarSvc(object):
def __init__(self, endpoint):
self.endpoint = endpoint
def barize(self, *args, **kwargs):
#call barize service call with args/kwargs utilizing self.endpoint
def barify(self, *args, **kwargs):
#call barify service call with args/kwargs utilizing self.endpoint
Implementierungscode:
foosvc = FooSvc('fooendpoint')
barsvc = BarSvc('barendpoint')
calls = ServiceCalls()
calls.register('fooize', foosvc.fooize)
calls.register('fooify', foosvc.fooify)
calls.register('barize', barsvc.barize)
calls.register('barify', barsvc.barify)
calls.fooize(args)
Diese Frage ist ein bisschen vage. Können Sie ein Codebeispiel hinzufügen? –
Ich habe es noch nicht wirklich geschrieben, ich habe versucht zu bestimmen, ob es überhaupt machbar ist, bevor ich Zeit darin investiere. Ich werde versuchen, etwas illustrational zusammen oben zu hacken, aber ... –
@SvenMarnach, das klärt die Frage ein wenig? Ich dachte daran, jeden Anruf zu einem Objekt zu machen, vielleicht mit den gesamten Servicedaten, dann entweder aufrufbar oder mit einer call() - Methode. Eigentlich, vielleicht werde ich so gehen, da es die Schnittstelle für Anrufbenutzer und Implementierer immer noch sauber lassen wird. –