Frage

Ich habe zwei Klassen: Account und Operator. Konto enthält eine Liste von Operatoren. Nun, wenn ein Operator (in der Liste) eine Nachricht empfängt, möchte ich Konto Objekt benachrichtigen, sowie einige Business-Logik auszuführen.

Ich denke an drei Alternativen auf, wie dies zu erreichen:

1) Halten Sie eine Referenz im Operator auf den Behälter [Account] Gegenstand und Methoden direkt aufrufen. Nicht unbedingt gut, weil der Kreis Referenzen.

2) Verwenden Sie Ereignisse. Soweit ich weiß, gibt es keinen integrierten Ereignismechanismus in Python Handhabung. Also, das ist ein bisschen schwierig zu implementieren.

3) Haben Sie nicht direkt Nachrichten an Betreiber senden. Stattdessen arbeiten nur Konten, und in ihnen intern Handler Operatoren. Dies ist ein wenig zu begrenzen, weil in diesem Fall kann ich keine Verweise auf Betreiber übergibt um.

Ich frage mich, welcher Ansatz am vorteilhaftesten aus der architektonischen Sicht ist. Wie Sie in der Regel diese Aufgabe erledigen?

Es wäre toll, wenn Sie Schnipsel in Python hinweisen könnten.

War es hilfreich?

Lösung

Sie sind über denken dies. Ernsthaft. Python ist nicht C ++; Ihre Bedenken sind nicht-Fragen in Python. Schreiben Sie einfach, was Sinn in Ihrem Problembereich macht.

"Nicht unbedingt gut, weil der Kreis Referenzen."

Warum nicht? Circularity ist nicht von Bedeutung hier überhaupt nicht. Bidirektionale Beziehungen sind große Dinge. Benutze sie. Python Müll sammelt sich ganz gut ohne Denken auf Ihrer Seite.

Was mögliches Problem haben Sie mit gegenseitigen (birectional) Beziehungen haben?

“... arbeiten nur Konten, und in ihnen intern Handler Operatoren. Dieser ist ein bisschen, weil in diesem Fall Begrenzung kann ich keine Verweise auf Betreiber übergeben um. „

Was? Ihre Betreiber sind Python-Objekte, übergeben Sie alles, was Sie wollen. Alle Python-Objekte sind (in der Tat) Referenzen, tun Sie es nicht schwitzen.

Was mögliches Problem haben Sie mit Manipulation Operator Objekte haben?

Andere Tipps

Es gibt keine "one-size-fits-all" -Lösung für die Beobachter-Muster. Aber in der Regel ist es besser, einen Eventmanager Objekt zu definieren, wo Interessenten sich für bestimmte Veranstaltungen anmelden können und diese Ereignisse veröffentlichen, wenn sie passieren. Es schafft einfach weniger Abhängigkeiten.

Beachten Sie, dass Sie eine globale Eventmanager-Instanz verwenden müssen, die während des Tests oder von einer allgemeinen OO Sicht (es ist eine globale Variable) problematisch sein können. Ich rate dringend gegen den Eventmanager um die ganze Zeit vorbei, denn das wird Ihren Code Krempel.

In meinem eigenen Code, der „Schlüssel“ für Veranstaltungen Registrierung ist die Klasse des Ereignisses. Der Eventmanager verwendet ein Wörterbuch (Ereignisklasse -> Liste der Beobachter) zu wissen, welches Ereignis geht, wo. Im Benachrichtigungscode können Sie dann verwenden dict.get(event.__class__, ()) Ihre Zuhörer zu finden.

würde ich Ereignis für diese Handhabung. Sie müssen es selbst nicht umsetzen - ich pydispatcher für genau diese Art von Event-Handling, und es ist immer sehr gut funktioniert (es verwendet schwachen Verweis intern, das kreisförmige Referenz Problem zu vermeiden).

Auch wenn Sie einen GUI-Framework verwenden, könnten Sie bereits einen Veranstaltungsrahmen haben Sie in, zum Beispiel: PyQt hat Signale und Slots.

>>> class Account(object):
...     def notify(self):
...         print "Account notified"
...
>>> class Operator(object):
...     def __init__(self, notifier):
...         self.notifier = notifier
...
>>> A = Account()
>>> O = Operator(A.notify)
>>> O.notifier()
Account notified
>>> import gc
>>> gc.garbage
[]
>>> del A
>>> del O
>>> gc.garbage
[]

Eine Sache, die Sie nicht über Instanzmethoden wissen ist, dass sie gebunden sind, wenn nachgeschlagen, wenn der Punkt-Syntax. Mit anderen Worten sagen A.notify bindet automatisch den Selbst Parameter A. benachrichtigen von Anschließend können Sie einen Verweis auf diese Funktion halten, ohne uneinbringlichen Müll zu schaffen.

Schließlich können Sie immer verwenden Kamaelia für diese Art der Sache.

Es gibt Beobachter-Muster auf der ganzen Web-Schnipsel. Eine gute Quelle für zuverlässigen Code ist aktiver Zustand, z:

http://code.activestate.com/recipes/131499/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top