我有2个模块,每个模块都包含一个类 我的主程序实例化一个类的对象,它实例化了类2的许多对象 我需要能够从第二类的实例中调用第一类中的函数 这是我的一般情况:
模块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)
但我想知道是否有更好的方法。
答案 0 :(得分:2)
我认为简单和松散耦合之间存在权衡。在我看来,简单性就是将回调传递给一个对象,而松耦合则是使用框架在对象之间传递信号。
例如,如果您使用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框架。创建按钮小部件时,不需要传递单击按钮时应执行的回调。但是,按钮会发出单击的信号,并且执行任何回调订阅该信号以执行所需的操作。
答案 1 :(得分:1)
你在做什么是完全有效的。请注意__init__
不是构造函数。 只是初始化方法。 (__new__
是Python的构造函数方法)
有关此主题的更多信息,请参阅问题Python's use of __new__ and __init__?
答案 2 :(得分:0)
我想你在这里错过了一个对象。特别是Creational Builder Pattern
class OneTwoBuilder:
def createOne(self, num_of_two=0):
o = One()
child = []
for _ in xrange(num_of_two):
t = Two()
o.callback(t)
child.append(t)
o.setChilds(child)
return o