Создание обратного вызова Python с помощью мартышки - PullRequest
1 голос
/ 16 февраля 2012

Я создаю объект, который будет представлять некоторую системную информацию, которая может быть изменена вне моей программы. Я думаю о том, чтобы позволить пользователю моего кода указать функцию обратного вызова, которая будет вызываться при обнаружении изменения. Это то, что у меня есть, похоже, работает (функция doodie будет предоставлена ​​пользователем)

def doodie(cls):
    print cls.teststr

class Testarino(object):
    def __init__(self):
        self.teststr = 'Yay!'

    def callback(self):
        raise NotImplementedError

    def go(self):
         self.callback(self)

 tester = Testarino()
 tester.callback = doodie

 tester.go()

Я думал об использовании предоставленного пользователем декоратора, но я думаю, что он может быть менее интуитивным для пользователя.

Это лучший способ сделать это? Есть ли лучший способ?

1 Ответ

3 голосов
/ 16 февраля 2012

Здесь не нужно патчить обезьяну, было бы чётче добавить функцию set_callback() в ваш класс Testarino, например:

def doodie(cls):
    print cls.teststr

class Testarino(object):
    def __init__(self):
        self.teststr = 'Yay!'
        self.callback = None

    def set_callback(self, callback):
        self.callback = callback

    def go(self):
         if self.callback is None:
             raise NotImplementedError
         self.callback(self)

tester = Testarino()
tester.set_callback(doodie)

tester.go()
...