我有 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/