Python--装饰器及其运用(拓展原来函数功能的一种函数)

1. 装饰器

1.1 装饰器的概念

python装饰器(Fuctional Decorators)是用于拓展原来函数功能的一种函数,
目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。
通常情况下,装饰器主要运用在引入日志,函数执行时间统计,
执行函数前预备处理,执行函数后清理功能,权限校验以及缓存方面。

1.1.1 无装饰器统计函数执行时间

import time


# 函数运行3s
def func():
    time.sleep(3)


start_time = time.time()
func()
end_time = time.time()
print("函数的运行时间是: %.2f 秒" % (end_time - start_time))

运行结果:
在这里插入图片描述


1.1.2 有装饰器统计函数执行时间

上述代码只执行了一次,原则上是没有问题的,如果有多个这样的需求,就会大量
重复代码。为了减少代码的重复,可以创建一个新的函数专门记录函数的执行时间
。在Python中,装饰器可以做到这一点,其语法以@开头。
import time


# 装饰器
def timeit(func):  # func为装饰器绑定的方法(绑定装饰器后自动传入)
    def result():
        start_time = time.time()
        func()  # 调用test方法
        end_time = time.time()
        print('函数运行时间为:%.2fs' % (end_time - start_time))

    return result  # 返回result方法


@timeit  # 添加装饰器
def test():
    print("函数运行测试")
    time.sleep(2)


test()  # 调用函数

运行结果:
在这里插入图片描述

当程序执行到test()的时候,发现它上面还有@timeit,所以会先执行
@timeit。@timeit等价于test()=  timeit(test())。

1.2 装饰器的运用

1.2.1 无参数的装饰器运用

import time


def timeit(func):
    def result():
        start_time = time.time()
        func()
        end_time = time.time()
        print("函数的运行时间是: %.2f 秒" % (end_time - start_time))

    return result


@timeit
def func_1():
    time.sleep(1)


@timeit
def func_2():
    time.sleep(2)


# 调用函数
func_1()
func_2()

运行结果:
在这里插入图片描述


1.2.2 有参数的装饰器运用

import time


def timeit(func):  # func为装饰器绑定的方法(绑定装饰器后自动传入)
    def result(arg1):  # 传入test方法的参数
        start_time = time.time()
        func(arg1)  # 调用test方法
        end_time = time.time()
        print('函数运行时间为:%.2fs' % (end_time - start_time))

    return result  # 返回result方法


@timeit  # 添加装饰器
def test(mStr):
    print(mStr)
    time.sleep(2)


test("测试函数运行时长:")  # 调用函数

在这里插入图片描述


1.2.3 装饰器既可以装饰带参函数也可以装饰不带参函数

import time


# 装饰器
def timeit(func):  # func为装饰器绑定的方法(绑定装饰器后自动传入)
    def result(*arg1, **kwargs):  # (传入非固定参数)这样即使装饰函数不带参数也可被装饰
        start_time = time.time()
        func(*arg1, **kwargs)
        end_time = time.time()
        print('函数运行时间为:%.2fs' % (end_time - start_time) + "\n")

    return result  # 返回result方法


@timeit  # 添加装饰器
def test_01():
    time.sleep(2)


@timeit  # 添加装饰器
def test_02(msg):
    print(msg)
    time.sleep(2)


test_01()  # 调用函数 不带参数
test_02("测试函数运行时长:")  # 调用函数 带参数

运行结果:
在这里插入图片描述



猜你喜欢

转载自blog.csdn.net/I_r_o_n_M_a_n/article/details/115343399