装饰器(闭包函数的一种应用场景)
1 为何要用装饰器:
开放封闭原则:对修改封闭,对扩展开放
2 什么是装饰器
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
装饰器的定义:在不修改其他函数名和函数内部的代码的同时还可以给该函数添加功能
3 装饰器的格式
装饰器的格式:def 函数名1(参数):这里的参数就是代替需要装饰的函数名
def 函数名2(*args,**kwargs):
添加功能
执行函数(*args,**kwargs)这里的函数执行,就是外层的参数执行
添加功能
return 执行函数后赋值的对象
return 函数名2
装饰器本身就是一个函数,属于闭包函数的一种。
4. 先看简单示范
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer def foo(): time.sleep(3) print('from foo') foo() 输出结果 from foo run time is 3.000171422958374
5 装饰器语法:
被装饰函数的正上方,单独一行
@deco1
@deco2
@deco3
def foo():
pass
foo=deco1(deco2(deco3(foo)))
def wrapper(func):
def inner(*args,**kwargs):
print('你正在调用%s函数'%func.__name__)
ret = func(*args,**kwargs)
return ret
return inner
@wrapper
def welcome(name):
print('welcome:%s'%name)
@wrapper
def home():
print('欢迎来到home页!')
welcome('alex')
home()
输出结果
你正在调用welcome函数
welcome:alex
你正在调用home函数
欢迎来到home页!