在一个类中,使用另一个类方法在一个类方法上应用装饰器

问题描述 投票:0回答:1

我有一个类

Alpha
,它有方法
__A
和方法
__B
。它们都在类
__init__
范围内或其他
Alpha
方法中调用,因此在
__
下使用 double__under ,并且它们都在
Alpha
属性上起作用。

如何制作另一个 wrapper 方法

__C
作为装饰器来扩展
__A
功能并在
__B
执行之前和之后应用
__A

代码:

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

    #@staticmethod
    def __C(self, func):
        def wrapper(*args, **kwargs):
            # self: Alpha
            self.__B()
            func(*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)

评论是我尝试过的一些想法,但我认为我做错了。

如何应用?我的实现有什么问题吗?

注意:我知道我可以手动重写

__A
,但在这个例子中,
__A
代表了很多需要用
__B
功能来扩展的方法。预先感谢。

python decorator python-decorators instance-methods
1个回答
0
投票

要使

__C
作为方法的装饰器,应将其定义为静态方法,其中包含包装函数,并以
self
作为位置参数,以便它可以调用绑定到
__B 的方法 
self
 
实例:

@staticmethod
def __C(func):
    def wrapper(self, *args, **kwargs):
        self.__B()
        func(self, *args, **kwargs)
        self.__B()
    return wrapper

演示这里

© www.soinside.com 2019 - 2024. All rights reserved.