在python中使用swift或objectivec中的继承实现委托安全吗?

2024-09-30 16:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

来自Objective-C和Swift,我在Python中实现了以下模式,以便在Python中使用基于协议的委托,就像在Swift或Obj-C中那样:

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)

我是这样使用它的:

应该充当委托的类只是从DataReceiverDelegate类继承。在

^{pr2}$

这一点没有问题,而且与Swift非常相似,其中协议也是类(或结构,不太确定)。在

我担心这样用Python实现委托会导致奇怪的问题,或者绝对不可能。那么这样处理授权安全吗?在

由于我目前对Python中的内存处理一无所知,我不确定这是否会因为“强引用循环”而导致死锁。那么,有没有一种方法来定义像“弱”类型的东西呢?在

唯一的问题是,委托给(DataReceiver)的类不知道self.delegate是什么类型,因此编辑器中的代码完成无法工作。在

编辑:

这是一个简单的例子,只是为了展示我的目标。在现实世界中,我们将添加检查以确保委托不是None。与Swift中的“安全展开选项”非常相似。在


Tags: selfnone协议datadefpassclassreceive
1条回答
网友
1楼 · 发布于 2024-09-30 16:28:19

你做的看起来不错。您甚至可以省去DataReceiverDelegate类,因为方法只在运行时找到,或者您可以将它作为抽象基类,用于一些额外的安全性和静态分析。在

Python2.7可以在其垃圾回收中处理引用循环,尽管更少的周期可能更好。如果你担心的话,你也可以查看弱引用。在

PyCharm中的类型暗示可以指示self.delegate的类型。在

相关问题 更多 >