我试图围绕python的装饰师。但有一点我不明白。这是我的代码,我的问题与func_decorate2
(带参数的装饰器)有关。
def func_decorate(f):
def wrapper():
print('wrapped');
f()
return wrapper
@func_decorate
def myfunc1():
print('func1')
def func_decorate2(tag_name):
def _(f):
print('underscore')
return f
return _
@func_decorate2('p')
def myfunc2():
print('func2')
print('call func1')
myfunc1()
print('call func2')
myfunc2()
将输出:
underscore
call func1
wrapped
func1
call func2
func2
为什么我在此示例中首先underscore
?
由于
答案 0 :(得分:3)
因为func_decorate2('p')
立即执行并返回一个装饰器,当解释器使用装饰器来装饰myfunc2
时,装饰器会自动执行。
要实现的诀窍是@
之后的部分只是一个表达式。它不一定是一个函数本身 - 它只需要评估为一个,并且评估会立即在定义上发生。
答案 1 :(得分:0)
因为func_decorate2错了。如果要在装饰器中使用参数,则必须再添加一个def级别
def func_decorate2(tag_name):
def _(f):
def _fun():
print('underscore')
return f
return _fun
return _