装饰器

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函数中

原文地址:https://www.cnblogs.com/regit/p/12808779.html