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

如何在Alpha类中用类方法__C做装饰器,使__B在__A前后执行?

问题分析与解决方案

原代码的核心问题

  • 装饰器__C被定义为实例方法,但在类定义阶段使用@__C装饰__A时,Python会直接执行__C(__A)。此时类还未实例化,没有可供传递的self参数,直接触发TypeError: __C() missing 1 required positional argument: 'func'。
  • 退一步说,即使参数传递没问题,原wrapper中引用的self是__C方法的实例参数,而装饰器执行时还未绑定实例,self的指向也会出错。

正确实现方式

将__C改为静态方法,并在wrapper中从调用参数里获取实例self,这样就能正确调用私有方法__B:

class Alpha:
    def __init__(self, a, b) -> None:
        self.a = a
        self.b = b
        self.run_me()

    @staticmethod
    def __C(func):
        def wrapper(self, *args, **kwargs):
            # 从wrapper的第一个参数获取实例self
            self.__B()
            # 调用原方法,传入实例和其他参数
            func(self, *args, **kwargs)
            self.__B()
        return wrapper

    def __B(self):
        self.b +=5
        print('Method B ran')

    @__C
    def __A(self):
        self.a += 1
        print('Method A ran')

    def run_me(self):
        self.__A()

alpha = Alpha(1,5)

运行后输出:

Method B ran
Method A ran
Method B ran

如果需要给多个类似__A的方法添加相同的扩展逻辑,只需要给目标方法加上@__C装饰器即可,完全满足批量扩展的需求。

内容的提问来源于stack exchange,提问作者Abdulrahman Sheikho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:55:13