gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:46:57 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com