我有一个关于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__
中指定的那些
所以我的问题是,当我们使用缩写符号来装饰 函数通过带参数的基于类的修饰,如何访问调用 参数列表,以便为每个修饰函数提供这些参数?在
关于装饰签名
这样做。。。在
。。。不是装修工的工作方式。decorator接受一个单参数,一个函数,并输出一个函数。在
尤其是,以上所说的不等于正确的方法就是这样。在
^{pr2}$访问
__call__
中的__init__
参数如果要访问传递给
__init__
的参数,可以将它们存储为实例属性。在对函数执行相同的操作
尽管,请记住,您不需要使用类decorator来完成此操作,但是下面的decorator将具有相同的行为。在
相关问题 更多 >
编程相关推荐