1.
def deco(func): def inner(): return "running inner" return inner @deco def target(): print("running target") print(target()) print(target)
输出
running inner
<function deco.<locals>.inner at 0x000002D1FC2F32F0>
2.
def tag(func): def inner(text): value = func(text) return "<p>" + value + "<p>" return inner #@tag def my_upper(text): value = text.upper() return value my_upper = tag(my_upper) # 相当于@tag下写my_upper函数
print(my_upper) print(my_upper("hello"))
输出
<function tag.<locals>.inner at 0x000002BA178932F0> my_upper相当于inner函数对象 <p>HELLO<p>
inner函数中的func相当于闭包中的自由变量,只不过变量变成了函数对象
3. 带参数的装饰器
def arg(name): def tag(func): def inner(text): value = func(text) return "<{name}>{value}</{name}>".format(name=name, value=value) return inner return tag @arg("p") def my_upper(text): value = text.upper() return value
# 不用@相当于
#tag = arg("p") # 传入接收的参数"p"并返回tag函数对象
#my_upper = tag(my_upper) # 传入my_upper并返回inner函数对象
#my_upper("hello") 调用inner函数
print(my_upper) print(my_upper("hello"))
输出
<function arg.<locals>.tag.<locals>.inner at 0x00000219DB683378> <p>HELLO</p>
在原来装饰器函数的基础上,外面再嵌套一个带参数的函数,这个参数可以用在inner函数中