You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类间事件通知?解决对象信息交互与循环导入问题

解决类间事件通知与循环导入问题

核心思路:解耦类依赖

避免循环导入的关键是让两个类不直接互相引用,而是通过抽象接口(比如回调函数、可调用对象集合)传递事件通知逻辑,让another_class不需要知道my_class的具体实现。

方法一:传递回调函数(最简洁)

让my_class在实例化another_class时,把自己的通知方法作为回调传递给another_class,another_class连接成功后直接调用这个回调。

修正后的完整代码:

class MyClass():
    def __init__(self):
        # 实例化时传入连接成功后的回调方法
        self.xpto = AnotherClass(on_connect_callback=self.on_connection_success)
        self.xpto.connect()

    def on_connection_success(self):
        # 收到连接成功通知后的处理逻辑
        print("连接成功!")

class AnotherClass():
    def __init__(self, on_connect_callback=None):
        # 保存外部传入的回调函数
        self.on_connect_callback = on_connect_callback

    def connect(self):
        # 模拟连接逻辑,这里假设连接成功
        connection_successful = True
        if connection_successful:
            self.on_connect()

    def on_connect(self):
        # 触发回调,通知外部
        if self.on_connect_callback:
            self.on_connect_callback()

# 测试代码
if __name__ == "__main__":
    my_instance = MyClass()

方法二:观察者模式(支持多监听)

如果后续需要多个类监听连接事件,可以用观察者模式,让another_class维护一个监听者列表,连接成功后遍历通知所有监听者。

代码示例:

class MyClass():
    def __init__(self):
        self.xpto = AnotherClass()
        # 将自身的通知方法注册为监听者
        self.xpto.add_listener(self.on_connection_success)
        self.xpto.connect()

    def on_connection_success(self):
        print("连接成功!")

class AnotherClass():
    def __init__(self):
        self.listeners = []

    def add_listener(self, listener):
        # 添加监听者(只需是可调用对象即可)
        self.listeners.append(listener)

    def connect(self):
        # 模拟连接成功逻辑
        connection_successful = True
        if connection_successful:
            self.on_connect()

    def on_connect(self):
        # 遍历通知所有注册的监听者
        for listener in self.listeners:
            listener()

# 测试代码
if __name__ == "__main__":
    my_instance = MyClass()

为什么能避免循环导入?

两种方法中,another_class都不需要导入MyClass:

  • 方法一中,another_class只需要接收一个可调用对象,不关心它属于哪个类;
  • 方法二中,another_class只需要维护一个可调用对象的列表,同样不依赖MyClass的具体类型。

就算两个类分属不同文件,也只需在MyClass所在文件导入AnotherClass,AnotherClass所在文件无需导入MyClass,彻底避免循环导入问题。

内容的提问来源于stack exchange,提问作者lxeng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:15:16