如何使用基于类的修饰符的缩写表示法为调用提供*arg和**kwargs?

2024-06-16 13:43:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于python中基于类的装饰器的问题,以及参数 可以在装饰给定函数时提供。在

考虑以下原型:

class MyDecoratorClass:
    def __init__(self, *args, **kwargs):
        # . . . Any code that is needed here
        pass

    def __call__(self, fun_to_decorate, *args, **kwargs):
        def inner(*args, **kwargs):
            # . . . Any code that is needed here
            return fun_to_decorate(*args, **kwargs)
        return inner

并考虑要装饰的功能:

^{pr2}$

装饰上述功能的一种方法是:

  • 步骤1:创建decorator类的实例。这将调用 构造函数,即__init__。如果我通过任何论点 下面,当实例是 创建。在

    decorator=MyDecoratorClass()

  • 第2步:指定要修饰的函数,如果需要,提供 与中的*args和/或**kwargs相对应的参数列表 __call__签名,因为它已在类中定义。

decorated_fun = decorator(myfun, arg1, arg2)

  • 第3步:最后调用修饰函数,如果需要,提供 函数本身的参数列表,如果提供,则对应于 __call__函数内部函数的形式参数列表。 如果我理解正确,内部形式参数的名称空间不同于__call__形式参数的名称空间

    装饰乐趣(…)

这很管用。但是如果我想用缩写符号 写这样的东西:

@MyDecoratorClass(arg1, arg2)
def myfun(*args, **kwargs):
    print("myfun was called")

在上面的例子中,我传递了两个完全相同的位置参数arg1和{}。现在 问题是,这两个参数没有(*args, **kwargs)指定 在__call__中,但实际上是在__init__中指定的那些

所以我的问题是,当我们使用缩写符号来装饰 函数通过带参数的基于类的修饰,如何访问调用 参数列表,以便为每个修饰函数提供这些参数?在


Tags: 函数self列表参数initdefargs装饰
1条回答
网友
1楼 · 发布于 2024-06-16 13:43:43

关于装饰签名

这样做。。。在

decorated_fun = decorator(myfun, arg1, arg2)

。。。不是装修工的工作方式。decorator接受一个单参数,一个函数,并输出一个函数。在

尤其是,以上所说的不等于正确的方法就是这样。在

^{pr2}$

访问__call__中的__init__参数

如果要访问传递给__init__的参数,可以将它们存储为实例属性。在

class MyDecoratorClass:
    def __init__(self, *args, **kwargs):
        # We store the arguments
        self.args = args
        self.kwargs = kwargs

        # Any other code that is needed here


    def __call__(self, fun_to_decorate): # Single argument
        def inner(*args, **kwargs):

            # Here you have access to self.args and self.kwargs

            return fun_to_decorate(*args, **kwargs)

        return inner

对函数执行相同的操作

尽管,请记住,您不需要使用类decorator来完成此操作,但是下面的decorator将具有相同的行为。在

def my_decorator_function(*args, **kwargs):

    def wrapper(decorated_func):

        def inner_wrapper(*inner_args, **inner_kwargs):
            # args and kwargs can be accessed here
            return decorated_func(*inner_args, **inner_kwargs)

        return inner_wrapper

    return wrapper

@my_decorator_function(arg1, arg2)
def myfun(*args, **kwargs):
    print("myfun was called")

相关问题 更多 >