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".
Wenn Sie nicht möchten, dass 'delegate'' None' ist, machen Sie das nicht zu einem Standard. –
Das macht natürlich Sinn! Vielen Dank! –
Welche Version von Python verwenden Sie? –