python 装饰器

Posted 北边的大鱼

tags:

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

一、装饰器的形成

需求1:  用一段代码测试一下函数的执行效率

技术分享图片
import time
print(time.time())  # 输出当前时间

def func1():
    time.sleep(1)  # 等待1秒
    print(111)

def func2():
    time.sleep(1)
    print(222)

start_time = time.time()  # 开始时间
func1()  # 执行此函数
end_time = time.time()  # 结束时间
print(此函数的执行时间是%s % (end_time-start_time))  # 输出执行时间 =结束时间-开始时间


start_time = time.time()
func2()
end_time = time.time()
print(此函数的执行时间是%s % (end_time-start_time))
装饰器--简单版

但是如果有多个函数,都想测试他们的执行时间,是不是每次都得func1 = timer(func1)?

这样还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等

第一版本不好,重复造轮子,测试函数的效率 必须得复制代码测试。

改版:使用函数

技术分享图片
# 将代码封装到函数中,基本完成
import time

def func1():
    time.sleep(1)
    print(111)

def func2():
    time.sleep(1)
    print(222)

def timmer(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print(此函数的执行时间是%s % (end_time-start_time))
timmer(func1)
timmer(func2)
装饰器--使用函数

需求2: 生产环境测试函数的真正的执行效率:线上500个函数

  线上问题:
    线上的函数你不改变
    函数的原本的调用方式不能改变

  原本线上的调用方式:
    func1

    func2

  但是用了测试效率的函数之后
    def timmer(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print(‘此函数的执行时间是%s‘ % (end_time-start_time))

  此时已经改变了函数的调用方式:

    func1()

    timmer(func1)

没有改变函数里面的函数体,但是改变了函数的调用方法,所以要解决:用最少的代码,解决调用方式一致性的问题。
最终完成的需求 func1() 这个指令既要执行func1函数,又要测试效率

技术分享图片
# 利用闭包,在不改变函数体的情况下
import time
def func1():
    time.sleep(1)
    print(111)

def func2():
    time.sleep(1)
    print(222)

def timmer(f): # f = func1 函数的内存地址
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print(此函数的执行时间是%s % (end_time-start_time))
    return inner
func1 = timmer(func1) # = inner
func1()  # inner()

def func1():
    print(func1)
func1 = 777
print(func1)
装饰器--利用闭包

 










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

[TimLinux] Python 装饰器

python装饰器

python装饰器关键代码

Python装饰器

python之装饰器

python 装饰器