class MyCalculate:
def __init__(self):
self.hooks = {}
def register_hook(self, flow_step, name, hook_func):
# e.g. {flow_step1: {name: [hook_func]}
# flow_step2: {name: [hook_func]}
self.hooks.setdefault(flow_step, {}).setdefault(name, []).append(hook_func)
def calculate(self, num1, num2, operation):
if "before_calculate" in self.hooks:
for func in self.hooks["before_calculate"][operation]:
func(num1, num2, operation)
if operation == "add":
res = num1 + num2
elif operation == "multiply":
res = num1 * num2
else:
raise
if "after_calculate" in self.hooks:
for func in self.hooks["after_calculate"][operation]:
func(res)
return res
def before_calculate(num1, num2, operation):
print(f'Before calculate: num1={num1}, num2={num2}, operation={operation}')
def after_calculate(res):
print(f'After calculate: result={res}')
app1 = MyCalculate()
app1.register_hook("before_calculate", "add", before_calculate)
app1.register_hook("after_calculate", "add", after_calculate)
app2 = MyCalculate()
print("app1计算结果", app1.calculate(7, 4, "add"))
print("app2计算结果", app2.calculate(5, 6, "multiply"))
Before calculate: num1=7, num2=4, operation=add
After calculate: result=11 # 只有加法存在钩子
app1计算结果 11
app2计算结果 30
实现计算前后钩子函数,且针对不同运算不同的钩子