Реализация обратного вызова или слушателя в Python - PullRequest
0 голосов
/ 25 октября 2019

Я только что вошел в программирование на Python (у меня есть опыт работы с Java). Я хочу реализовать callback / listener в классе. Я перепутал с доступными образцами. Я только что реализовал образец. Пожалуйста, направьте меня

мой класс 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 для этого?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Создайте класс, который принимает обратный вызов в качестве аргумента:

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()
1 голос
/ 25 октября 2019

Давайте добавим обработчики в класс с хорошим 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()
...