如何在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
相关产品推荐
相关产品推荐

