【问题标题】:Implementation of callback or listener in pythonpython中回调或监听器的实现
【发布时间】:2020-02-21 13:36:50
【问题描述】:

我刚进入 python 编程(我有 java 经验)。我想在一个类中实现回调/监听器。我对可用的样本感到困惑。我刚刚实现了一个示例。请指导我

我的python类如下

class myClass:
    def __init__(self):
        self.__result = 0

    def connect(self):
        self.__result = 1

我的主要python代码如下

import myClass

def on_connect(result):
    print("Connected with result code "+result)

myclass = myClass()
myclass.on_connect = on_connect

myclass.connect()

我只是想在 on_connect 方法主代码中接收结果。如何为此修改 myClass ?

提前致谢

【问题讨论】:

  • 连接发生在类实例的上下文中,那为什么不想在类中处理呢?

标签: python python-3.x callback listener


【解决方案1】:

创建一个接受回调作为参数的类:

class MyClass:

    def __init__(self, on_connect=None):
        self._result = 0
        # store callback reference in a variable
        self._on_connect = on_connect

    def connect(self):
        self._result = 1
        # if callback is defined and it is a function/method
        if self._on_connect and callable(self._on_connect):
            # Send the object instance to the callback, 
            # you may use the same callback for multiple objects.
            self._on_connect(self)

    def get_result(self):
        return self._result

然后:

import MyClass

def on_connect_callback(instance):
    print('Connected with result code {}'.format(
        instance.get_result()))

my_obj = MyClass(on_connect=on_connect_callback)
my_obj.connect()

【讨论】:

    【解决方案2】:

    让我们为类添加处理程序,使用漂亮的add 方法和调用回调的通用fire

    class myClass:
        def __init__(self):
            self.__result = 0
            self.on_connect = []
    
        def connect(self):
            self.__result = 1
            self.fire()
    
        def add_listener(self, listener):
            self.on_connect.append(listener)
    
        def fire(self):
            for listener in self.on_connect:
                listener(self.__result)
    

    然后我们只需要在你的主代码中重做一件事——我们添加监听器的方式。

    import myClass
    
    def on_connect(result):
        print("Connected with result code "+result)
    
    myclass = myClass()
    myclass.add_listener(on_connect)
    
    myclass.connect()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2015-10-07
      相关资源
      最近更新 更多