python - 在Python中如何调用实例创建者的函数?

标签 python class callback

我有 2 个模块,每个模块都包含一个类。
我的主程序实例化了类 One 的一个对象,该对象实例化了类 Two 的许多对象。
我需要能够从类二的实例调用类一中的函数。
这是我所拥有的一般外观:

模块mod_one.py:

import mod_two

class One:
    def __init__(self):
        self.new_instance = Two()

    def call_back_func(self):
        # This function should be called 
        # from the new instance of class Two()

模块mod_two.py:

class Two:
    def __init__(self):
        # Call call_back_func() of module mod_one

我发现的唯一方法是将回调函数 call_back_func() 作为参数传递给第二类,如下所示:

self.new_instance = Two(self.call_back_func)

但我想知道是否有更好的方法。

最佳答案

我认为这里需要在简单性和松散耦合之间进行权衡。在我看来,简单的方法是将回调传递给对象,而松散耦合则使用框架在对象之间传递信号。

例如,如果您使用 blinker您可以使用这种替代设计的信号库:

from blinker import signal

class One:
    def __init__(self):
        self.two = Two()
        self.two.some_signal.connect(self.callback)

    def callback(self, data):
        print 'Called'

class Two:
    some_signal = signal('some_signal')

    def process(self):
        # Do something                                
        self.some_signal.send()

one = One()
one.two.process()

在上面的代码中,Two 对象甚至不知道是否有其他对象对其内部状态变化感兴趣。但是,它确实通过发出一个信号来通知它们,其他对象(在本例中为 One 对象)可能会使用该信号来执行某些特定操作。

关于这种方法的一个很好的例子是 GUI 框架。创建按钮小部件时,不需要传递单击按钮时应执行的回调。但是,按钮会发出单击信号,并且执行订阅该信号的任何回调以执行所需的操作。

关于python - 在Python中如何调用实例创建者的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594549/

相关文章:

java - 如何更新第二堂课中的变量totalCost

java - Twitter Android SDK 不执行回调

c# - 如何实现递归回调模式?

javascript - Node.js:你能在流中使用异步函数吗?

python - Python中所有向量组合的集合

python - 如何列出 python 中存在的库?

c++ - 在父类(super class)中调用抽象方法,并在C++中的子类中实现它?

带有初始值设定项的 C++ 匿名类

python - 覆盖保存方法迫使我在管理中保存两次

python - python selenium webdriver 和 just selenium 之间的区别?