4.装饰器

1.三个功能函数  f1,f2,f3

# -*- coding: utf-8 -*-
#__author:jiangjing
#date:2018/1/5
import time

def f1():
    for i in range(100):
        print(i)

def f2():
    for i in range(1000):
        print(i)

def f3():
    for i in range(10000):
        print(i)

2.项目遇到性能瓶颈,需要统计各个函数执行的时间

第一种解决方案(红色部分为新加代码):

# -*- coding: utf-8 -*-
#__author:jiangjing
#date:2018/1/5
import time

def f1():
    start_time = time.time()
    for i in range(100):
        print(i)
    end_time = time.time()
    print(end_time - start_time)

def f2():
    start_time = time.time()
    for i in range(1000):
        print(i)
    end_time = time.time()
    print(end_time - start_time)

def f3():
    start_time = time.time()
    for i in range(10000):
        print(i)
    end_time = time.time()
    print(end_time - start_time)

分析:为了统计各个函数执行的时间,修改了函数原有的代码,违反了代码设计的开放-封闭原则(对扩展开放,对修改关闭)

3.使用装饰器进行改进(红色部分为新加代码):

# -*- coding: utf-8 -*-
#__author:jiangjing
#date:2018/1/5
import time

def cal_consume_time(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)
    return wrapper

@cal_consume_time
def f1():
    for i in range(100):
        print(i)

@cal_consume_time
def f2():
    for i in range(1000):
        print(i)

@cal_consume_time
def f3():
    for i in range(10000):
        print(i)

分析:使用装饰器之后符合开放-关闭原则

(1)装饰器是以闭包为基础的(闭包在上一篇有介绍);

(2)f1函数的 @cal_consume_time 这个语法糖等价于:f1 = cal_consume_time(f1)

(3)装饰带参数的函数

# -*- coding: utf-8 -*-
#__author:jiangjing
#date:2018/1/5
import time

def cal_consume_time(func):
    def wrapper(*args):
        start_time = time.time()
        func(args)
        end_time = time.time()
        print(end_time - start_time)
    return wrapper

@cal_consume_time
def f1(*args):
    for i in range(100):
        print(i)
    print(args)

 

posted on 2018-01-29 17:59 ~生如夏花 阅读() 评论() 编辑 收藏

版权声明:本文为jiangjing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jiangjing/p/8378664.html