python基础_装饰器

装饰器----本质上就是功能函数,为其他函数添加新的功能的函数。

装饰器设计的基本原则:

1.不修改被装饰函数的源代码(开放封闭原则)。

2.为被装饰过的函数添加新功能后,不修改被装饰函数的调用方式。

装饰器=高阶函数+函数嵌套+闭包

高阶函数:函数接收的参数是一个函数名或函数的返回值是一个函数名

函数嵌套:

def fun1(name):
    print('from fun1 %s' %name)
    def fun2():
        print('from fun2')
        def fun3():
            print('from fun3')
        fun3()
    fun2()
fun1('sb')

from fun1 sb
from fun2
from fun3

闭包:在一个定义域里定义变量,相当于打了一个包

def fun1(name):
    print('from fun1 %s' %name)
    def fun2():
        print('from fun2 %s' %name)
        def fun3():
            print('from fun3 %s' %name)
        fun3()
    fun2()
fun1('sb')

from fun1 sb
from fun2 sb
from fun3 sb

装饰器基本框架

def timer(func):
    def wrapper():
        func()
    return wrapper

加上参数

def timer(func):
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
    return wrapper

加上功能

import time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)
        stop_time=time.time()
        print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
    return wrapper

加上返回值

import time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
        return res
    return wrapper

使用装饰器

import time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
        return res
    return wrapper

def cal(array):
    res=0
    for i in array:
        res+=i
    return res

cal= timer(cal)
cal(range(10))

函数[<function cal at 0x0000014B96B266A8>],运行时间是[0.0]

使用语法@

import time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
        return res
    return wrapper

@timer  #@timer就等同于cal=timer(cal)
def cal(array):
    res=0
    for i in array:
        res+=i
    return res

cal(range(10))

函数[<function cal at 0x0000019E6BB566A8>],运行时间是[0.0]

 

posted @ 2018-06-08 00:28  Liu呵呵  阅读(98)  评论(0)    收藏  举报