You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:27:05