2016-05-24 2 views
-1

Von Objective-C & Swift Ich habe folgende Muster in Python implementiert Protokoll-basierte Delegation in Python zu verwenden, wie ich dies in Swift oder Obj-C tun würde:Ist es sicher, die Delegierung in Python mit Vererbung wie in swift oder objective-c zu implementieren?

class DataReceiverDelegate: 

    def data_receiver_did_receive_data(self, data): 
     pass 

    def data_receiver_did_update_settings(self): 
     pass 

class DataReceiver 

    def __init__(self, delegate = None): 
     self.delegate = delegate 

    def received_data(self, data): 
     self.delegate.data_receiver_did_receive_data(data) 

Dies ist, wie ich es:

Die Klasse, die als Delegat fungieren sollte, erbt einfach von der Klasse DataReceiverDelegate. Diese

class DataParser(object, DataReceiverDelegate): 

    def __init__(self): 
     self.data_receiver = DataReceiver(self) 
     # or -> self.data_receiver.delegate = self 

    def data_receiver_did_receive_data(self, data): 
     print data 

arbeitet ohne Problem und ist sehr ähnlich wie Swift, wo Protokolle sind Klassen (oder structs, nicht ganz sicher), auch.

Ich habe Bedenken, dass die Implementierung von Delegierung in Python wie folgt zu seltsamen Problemen führt oder ein absolutes Nein ist. Ist es also sicher, solche Delegationen zu verwalten?

Da ich momentan keine Ahnung habe, wie man mit Python umgehen kann, bin ich nicht sicher, ob dies aufgrund eines "starken Referenzzyklus" zu einem Deadlock führen könnte. Gibt es eine Möglichkeit, etwas wie einen "schwachen" Typ zu definieren?

Auch das einzige Problem ist, dass die Klasse, die delegiert an (DataReceiver in diesem Fall) keine Ahnung hat, welcher Typ self.delegate ist, so Code-Vervollständigung in Editoren funktioniert nicht.

EDIT:

Dies ist ein vereinfachtes Beispiel nur zu zeigen, was ich bin nach. In einer realen Welt würde man Prüfungen hinzufügen, um sicherzustellen, dass der Delegierte nicht None ist. Ganz ähnlich wie "Swallout-Optionen".

+0

Wenn Sie nicht möchten, dass 'delegate'' None' ist, machen Sie das nicht zu einem Standard. –

+0

Das macht natürlich Sinn! Vielen Dank! –

+0

Welche Version von Python verwenden Sie? –

Antwort

1

Was Sie tun, sieht gut aus. Sie könnten sogar die DataReceiverDelegate Klasse weglassen, da Methoden nur zur Laufzeit gefunden werden, oder Sie könnten es zu einer abstrakten Basisklasse für zusätzliche Sicherheit und statische Analyse machen.

Python 2.7 kann Referenzzyklen in seiner Speicherbereinigung behandeln, obwohl weniger Zyklen wahrscheinlich besser ist. Sie können auch schwache Referenzen überprüfen, wenn es Sie beunruhigt.

Typ Hinting in PyCharm kann angeben, was der Typ self.delegate ist.

Verwandte Themen