装饰器

Posted regit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

 

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

 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码