设为首页 加入收藏

TOP

函数的特殊使用方式(三)
2023-07-25 21:28:54 】 浏览:84
Tags:方式
**kwargs) end = time.time() print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}") return wrapper return inner

需要改造的地方:
1、装饰器函数此时并不是通过参数来传入被装饰的函数,而是定义装饰器自己的参数,演示时使用的是一个位置参数n,在后续如果遇到比较复杂的情况下也可以使用关键字形参、*args、**kwargs等收集参数。
2、内部函数inner用来收集被装饰的函数。
3、内部函数inner的内部函数wrapper用来收集被装饰的函数的参数。并编写需要增强的命令。最终要执行被装饰的函数其实就是执行这个wrapper函数。
装饰器接收参数:

import time


def decorator3(n):
    def inner(func):
        def wrapper(*args, **kwargs):
            begin = time.time()
            for _ in range(n):
                func(*args, **kwargs)
            end = time.time()
            print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}")

        return wrapper

    return inner


@decorator3(10)
def mysum3(a, b):
    from time import sleep
    total = a
    for _ in range(total + 1, b + 1):
        sleep(0.01)
        total += _
    print(total)


mysum3(1, 10)
# 等价于:mysum3 = decorator3(10)(mysum3)

55
55
55
55
55
55
55
55
55
55
函数mysum3运行的总时间为:1.41

5.4.4.2.4 装饰器的返回值

如果你了解了上一节的内容,很容易想到只要在wrapper函数中return就是被装饰函数的返回值。
装饰器定义:接收被装饰函数的返回值

import time


def decorator3(n):
    def inner(func):
        def wrapper(*args, **kwargs):
            begin = time.time()
            for _ in range(n):
                func(*args, **kwargs)
            end = time.time()
            print(f"函数`{func.__name__}`运行的总时间为:{end - begin:.3}")
            return end - begin
        return wrapper

    return inner

1、在上面的代码中,return end – begin就是被装饰器的返回值。可以通过变量进行接收。

@decorator3(3)
def mysum3(a, b):
    from time import sleep
    total = a
    for _ in range(total + 1, b + 1):
        sleep(0.01)
        total += _
    print(total)


total_time = mysum3(1, 10)
print(total_time)

函数mysum3运行的总时间为:1.42
1.4218323230743408

5.4.4.2.5 多个装饰器装饰同一个函数

对于某个函数,可以使用多个装饰器对其进行装饰,写法如下:

@decorator1
@decorator2
def 被装饰函数():
	pass

对于被多个装饰器装饰的函数,其装饰顺序为由最近到远,即decorator2会先装饰,然后是decorator1。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python unittest+ddt+openpyxl 下一篇【K哥爬虫普法】大数据风控第一案..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目