装饰器

  1. 什么是装饰器?

    装饰:给已有的对象(函数)添加新的功能

    器:工具              在python中指具备某些功能的函数

    装饰器:装饰器就是一个给其他函数增加功能的函数

  2. 一种设计原则:

    开闭原则:对扩展开放

                     对修改封闭

  3. 装饰器怎么用

我们用一个例子说明装饰器的作用及用法

例子: 现需要统计一段程序运行的时间

#统计程序运行时间,首先我们写一个程序
import time
def index():
    time.sleep(1)
    print('login')
#以上就是一个打印login的程序,该程序休眠时间为1S
#如果我们要增加一个计时功能,该怎么实现呢?首先我们可以尝试从我们的设计原则入手
#如果我们按照增加代码的形式可以看下:
import time
def index():
    time.sleep(1)
    print('login')
start=time.time()
index()
end = time.time()
print('程序运行的时间',end-start)
#或者
import time
def index():
    time.sleep(1)
    print('login')
def wrapper():
    start=time.time
    index()
    end=time.time
    print('程序运行时间',end-start)
 wrapper()
#如果这样写我们就改变了源码或调用方式,不符合要求
#那我们按照不改变源码,不改变调用方式
#利用闭包函数
import time
def index():
    time.sleep(1)
    print('login')
def time_count(func):
    #func=index       #利用闭包函数的将变量func=index带给内部的wrapper函数
    def wrapper():
        start=time.time()
        func()
        end=time.time()
        print('程序运行时间',end-start)
    return wrapper    #time_count函数的返回值为wrapper函数
index=time_count(index)  #index=wrapper 括号内index为初始的index
index()   #调用index就可以实现计时功能

 

 

为了让我们作的修改更能灵活,能继续增加功能,并且如果原代码函数有返回值,需要我们将返回值传递出来,我们可以将装饰器改成

import time
def time_count(func):
    #func=index       #利用闭包函数的将变量func=index带给内部的wrapper函数
    def wrapper(*args, **kwargs):
        start=time.time()
        res=func(*args, **kwargs)
        end=time.time()
        print('程序运行时间',end-start)
        return res
    return wrapper    #time_count函数的返回值为wrapper函数
@time_count
def index():
    time.sleep(1)
    print('login')
    return 123
res=index()
print('返回值res',res)

 

这就是一个完整的装饰器

posted on 2018-11-29 16:15  小锦毛  阅读(157)  评论(0编辑  收藏  举报