This is a follow-on to this recently posted recipe:
Implementing function-based callbacks in Python: https://code.activestate.com/recipes/580787-implementing-function-based-callbacks-in-python/?in=user-4173351
This new recipe shows how to create and use callbacks in Python, using classes with methods, instead of plain functions, as was done in the recipe linked above. All other points such as reasons and benefits for using callbacks, are more or less the same as mentioned in the previous recipe, except that class instances can carry state around, so to that extent, the two approaches are different.
https://jugad2.blogspot.in/2017/04/python-callbacks-using-classes-and.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | '''
File: callback_demo2.py
To demonstrate implementation and use of callbacks in Python,
using classes with methods as the callbacks.
Author: Vasudev Ram
Copyright 2017 Vasudev Ram
Web site: https://vasudevram.github.io
Blog: https://jugad2.blogspot.com
Product store: https://gumroad.com/vasudevram
'''
from __future__ import print_function
import sys
from time import sleep
class FileReporter(object):
def __init__(self, filename):
self._filename = filename
try:
self._fil = open(self._filename, "w")
except IOError as ioe:
sys.stderr.write("While opening {}, caught IOError: {}\n".format(
self._filename, repr(ioe)))
sys.exit(1)
def report(self, message):
self._fil.write(message)
class ScreenReporter(object):
def __init__(self, dest):
self._dest = dest
def report(self, message):
self._dest.write(message)
def square(i):
return i * i
def cube(i):
return i * i * i
def processor(process, times, report_interval, reporter):
result = 0
for i in range(1, times + 1):
result += process(i)
sleep(0.1)
if i % report_interval == 0:
# This is the call to the callback method
# that was passed to this function.
reporter.report("Items processed: {}. Running result: {}.\n".format(i, result))
file_reporter = FileReporter("processor_report.txt")
processor(square, 20, 5, file_reporter)
stdout_reporter = ScreenReporter(sys.stdout)
processor(square, 20, 5, stdout_reporter)
stderr_reporter = ScreenReporter(sys.stderr)
processor(square, 20, 5, stderr_reporter)
|
More discussion and sample output here:
https://jugad2.blogspot.in/2017/04/python-callbacks-using-classes-and.html