Python装饰器代码简单实现


先说一说装饰器的个人理解吧

  • 装饰器就是在不改变原函数的情况下,给原函数增加一些额外的功能,装饰器本质就是一个闭包(先说这么多,以后再补充)

    不接受参数的通用装饰器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    """
    定义一个装饰器,这是一个不接受参数的装饰器
    """


    def decorator(func):
    # 加 *args, **kwargs 这两个参数为了能够接受参入函数的参数(你不能保证传入的函数有没有参数,以及这个传入的函数有多少个参数)
    def wrapper(*args, **kwargs):
    print("我是装饰器")
    fun = func(*args, **kwargs)
    # 最后再把传入的函数返回出去
    return fun
    # 这个return 很重要,装饰器就语法就是这样, 返回内部函数,其实装饰器本质就是一个闭包
    return wrapper


    """
    下面是装饰器的使用
    """


    @decorator
    def function():
    print("我是一个函数")


    """
    执行函数
    """
    if __name__ == '__main__':
    function()

可以接收参数的装饰器

我这里就写一个只接收一个参数的装饰器, 如果需要多个参数, 只需要再加上就好啦(不懂就留言评论,看到就回)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41


"""
定义一个装饰器,这是一个不接受参数的装饰器
"""


def parameter_deco(item):

def decorator(func):
# 加 *args, **kwargs 这两个参数为了能够接受参入函数的参数(你不能保证传入的函数有没有参数,以及这个传入的函数有多少个参数)
def wrapper(*args, **kwargs):
print("我是装饰器")
print("********* 我是装饰器传入的参数 %s **********" % item)
fun = func(*args, **kwargs)
# 最后再把传入的函数返回出去
return fun
# 这个return 很重要,装饰器就语法就是这样, 返回内部函数,其实装饰器本质就是一个闭包
return wrapper

# 看到这里你是不是发现,带有参数的装饰器,就比上面那个不带参数的装饰器多了一层外部函数,外部函数用来接收参数,然后再把内层函数返回
return decorator


"""
下面是装饰器的使用
"""


# 这里就传入一个值就行(这里我传入一个字符串,这是我的个人博客网站,欢迎访问)
@parameter_deco("https://lxb-log.github.io/")
def function():
print("我是一个函数")


"""
执行函数
"""
if __name__ == '__main__':
function()

使用装饰器实现测试某函数的执行时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import time


def time_decorator(func):

def wrapper(*args, **kwargs):

# 执行传入的函数的开始时间
begin = time.time()
# 执行传入的函数
fun = func(*args, **kwargs)
# 执行传入的函数的结束时间
end = time.time()
print("该函数执行花费%s" % (end-begin))

return fun
return wrapper


# 这里就传入一个字符串就行(这是我的个人博客网站,欢迎访问)
@time_decorator
def function():
# time.sleep(2) 延迟2秒,跟容易理解
time.sleep(2)
print("https://lxb-log.github.io/")


"""
执行函数
"""
if __name__ == '__main__':
function()