Украшение обратного звонка - PullRequest
0 голосов
/ 14 мая 2018

Название, вероятно, вводит в заблуждение - но я не могу придумать ничего лучше, чем «какой элегантный способ решить это?»

У меня есть базовый класс, который получает обратный вызов. Обратный вызов используется примерно так:

class BaseClass(object):

    def __init__(self, callback, *args, **kwargs):
        self.callback = callback

    def useful_method(self):
        do_something()
        do_more_stuff()

        self.callback()

Пока все хорошо. Теперь я хочу наследовать от этого класса, и я хочу сделать что-то эквивалентное этому:

class MyClass(BaseClass):

    def useful_method(self):
        do_something()
        do_more_stuff()

        if self.condition and self.callback():
            self.condition = False

Я хочу избежать дублирования всего тела useful_method до обратного вызова. Я не могу сделать условный super вызов в useful_method, потому что условие генерируется только в вызовах do_something() и do_more_stuff(). Какой элегантный выход из этого?

РЕДАКТИРОВАТЬ: при условии, что я не могу редактировать базовый класс.

1 Ответ

0 голосов
/ 14 мая 2018

Если вы не можете изменить базовый класс, вы можете изменить callback на условный , что-то вроде:

class MyClass(BaseClass):

    def __init__(self, callback, *args, **kwargs):
        self.condition = False  # initialize as False/True in dependence of your use case
        self._callback = callback
        super(MyClass, self).__init__(self.conditional_callback, *args, **kwargs)

    def conditional_callback(self):
        if self.condition and self._callback():
            self.condition = False

Таким образом, все, что вызовет self.callback() upstream будет действовать так, как если бы он сначала выполнял условие вместо обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...