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

时间:2011-12-21 18:27:17

标签: python class callback

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

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

3 个答案:

答案 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