【发布时间】:2018-08-19 00:23:43
【问题描述】:
我有一个关于 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
并考虑要装饰的功能:
def myfun(*args, **kwargs):
print("myfun was called")
装饰上述功能的一种方法如下:
-
第 1 步: 创建装饰器类的实例。这将调用 构造函数,即
__init__。如果我通过任何论点 下面,当实例为 已创建。装饰器 = MyDecoratorClass()
第 2 步:指定要修饰的函数,如果需要,提供 对应于
*args和/或**kwargs的参数列表__call__签名,因为它已在类中定义。
decorated_fun = decorator(myfun, arg1, arg2)
-
第 3 步: 最后调用修饰函数,如果需要,提供一个 函数本身的参数列表,如果提供,则对应于
__call__函数内的内部函数的形参列表。 如果我理解正确的话,内部形参的命名空间不同于__call__形参的命名空间decorated_fun(...)
这行得通。但是,如果我想使用我拥有的缩写符号 写这样的东西:
@MyDecoratorClass(arg1, arg2)
def myfun(*args, **kwargs):
print("myfun was called")
在上面的示例中,我传递了完全相同的两个位置参数arg1 和arg2。现在
问题是,这两个参数没有指定(*args, **kwargs)
在__call__ 中,但实际上是在__init__ 中指定的那些
所以我的问题是,当我们使用缩写符号来装饰 通过带有参数的基于类的装饰函数,如何访问 call 参数列表以便为每个修饰函数提供这些参数?
【问题讨论】:
标签: python decorator python-decorators