如何在Python抽象类中定义装饰器并在继承子类中调用实现前置逻辑
实现方案
方案1:模板方法模式(最简便,无需装饰器)
该方案逻辑内聚在抽象类中,子类无需关心前置逻辑,仅需实现业务代码即可,完全避免参数匹配错误问题:
import abc class MyAbstractClass(metaclass=abc.ABCMeta): @abc.abstractmethod def my_abstract_method(self, request): # 子类仅需实现该方法的业务逻辑 pass def update_database(self, param_one, param_two): # 你的数据库更新/后端计算逻辑 results = "<DO SOME BACKEND CALCULATIONS>" return results # 统一执行入口,内置前置更新逻辑 def run(self, request, param_one, param_two): print('执行前置逻辑', param_one, param_two) # 先完成数据库更新 self.update_database(param_one, param_two) # 再执行子类实现的业务逻辑 self.my_abstract_method(request) print('前置逻辑执行完成')
子类实现代码:
class ChildClass(MyAbstractClass): def my_abstract_method(self, request): # 这里写你的业务逻辑即可 # get_data() print(f"执行业务逻辑,request参数:{request}")
调用方式:
child = ChildClass() child.run(request="你的请求参数", param_one="参数1", param_two="参数2")
方案2:修正装饰器实现
如果你坚持要使用装饰器方案,需要调整装饰器的参数匹配逻辑,修复后的代码如下:
import abc class MyAbstractClass(metaclass=abc.ABCMeta): @abc.abstractmethod def my_abstract_method(self, request): pass # 去掉@staticmethod/@classmethod装饰,定义为类内普通函数 def decorator_func(func): def run_func(self, request, *args, **kwargs): # param_one、param_two可根据实际需求从参数中提取 param_one = kwargs.get("param_one", "默认值1") param_two = kwargs.get("param_two", "默认值2") print('INSIDE run_func', param_one, param_two) # 先执行数据库更新 self.update_database(param_one, param_two) # 执行被装饰的业务方法 result = func(self, request, *args, **kwargs) print('FINISHED run_func') return result return run_func def update_database(self, param_one, param_two): results = "<DO SOME BACKEND CALCULATIONS>" return results
子类实现代码:
class ChildClass(MyAbstractClass): @MyAbstractClass.decorator_func def my_abstract_method(self, request): # 业务逻辑 print(f"执行业务逻辑,request参数:{request}")
调用方式:
child = ChildClass() child.my_abstract_method(request="你的请求参数", param_one="参数1", param_two="参数2")
内容的提问来源于stack exchange,提问作者shayms8
相关产品推荐
相关产品推荐

