装饰器(decorator):为其他函数添加附加功能
原则:1.不修改被修饰函数源代码
2.不修改被修饰函数的调用方式
装饰器=高阶函数+函数嵌套+闭包
import time def timmer(func): def wapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('函数运行时间是%s'%(stop_time-start_time)) return res return wapper @timmer def cal(l): start_time=time.time() res=0 for i in l: time.sleep(0.1) res+=i stop_time=time.time() cal(range(100))
上述代码是一个装饰器案例,可能看不懂,下面分成三部分进行讲解
1.高阶函数
接收一个函数或者返回一个函数都称为高阶函数
例如:
def foo(): print("你好") def test(func): print(func) func() test(foo)
2.函数中嵌套定义另一个函数,叫函数嵌套
3.嵌套函数各自封闭参数,叫做函数的闭包
装饰器的基本框架
def timmer(func): def wrapper(): func() return wrapper # 传入函数,返回嵌套函数 # 嵌套函数中传入原函数构成装饰器
这样在不改变源代码的情况下,能够增加或者修改原函数,下面在函数的上方用@timmer进行调用即可
将装饰器中传入*args可变参数和**kwargs可变关键字参数,即可做成万用的函数装饰器
例子2 制作验证装饰器
def auth_func(func): def wrapper(*args,**kwargs): func(*args,**kwargs) username=input('用户名:').rstrip() password=input('密码:').rstrip() if (username=='nnn' and password =='123'): res=func(*args,**kwargs) return res else: return print('密码错误') return wrapper @auth_func def index(): print('欢迎来到京东') @auth_func def home(name): print('个人家园%s'%name) @auth_func def shoppingcart(name): print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜')) index() home("littlepage's home") shoppingcart('littlepage')
上方代码是一个验证装饰器,在函数前加上@可调用装饰器
再加上前面学习的全局变量,则可以模拟session
usr_dictionary={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): func(*args,**kwargs) username=input('用户名:').rstrip() password=input('密码:').rstrip() if usr_dictionary['username'] and usr_dictionary['login']: res=func(*args,**kwargs) if (username=='nnn' and password =='123'): res=func(*args,**kwargs) return res else: return print('密码错误') return wrapper @auth_func def index(): print('欢迎来到京东') @auth_func def home(name): print('个人家园%s'%name) @auth_func def shoppingcart(name): print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜')) index() home("littlepage's home") shoppingcart('littlepage')