(1)装饰器
装饰器的本质就是函数,功能是为其它函数添加附加功能
装饰器的原则是:不修改被修改函数的源代码和调用方式
装饰器=高阶函数+函数嵌套+闭包
装饰器的框架为:
def timmer(func): def wrapper(): print(func) #func相当于作用域 func() return wrapper
要求为以下代码加一个装饰器,计算睡眠时间
def test(): time.sleep(3) print('test函数运行完毕')
return test test()
将装饰器的框架引入:
import time def timmer(func): #func=test def wrapper(): start_time = time.time() res=func() #就是在运行test() stop_time = time.time() print('运行时间是%s' % (stop_time - start_time))
return res return wrapper def test(): time.sleep(3) print('test函数运行完毕')
return '这就是test的返回值' test=timmer(test) #返回的是wrapper的地址 res=test() #执行的是wrapper()
print(res)
运行结果为:
test函数运行完毕
运行时间是3.0003621578216553
这是test的返回值
此时虽然没有改变原函数的调用方式,但要在test()之前执行test=timmer(test)这一个赋值操作,相当于改变了源代码,故需要进行优化
import time def timmer(func): def wrapper(): start_time = time.time() res=func() stop_time = time.time() print('运行时间是%s' % (stop_time - start_time)) return res return wrapper @timmer def test(): time.sleep(3) print('test函数运行完毕') return '这是test的返回值' res=test() #执行的是wrapper() print(res)
给函数加上参数(# *args:用来将参数打包成tuple给函数体调用;# **kwargs:打包关键字参数成dict给函数体调用)
import time def timmer(func): #func=test1 def wrapper(*args,**kwargs): #test('王强',age=18) args=('王强') kwargs={'age':18} start_time=time.time() res=func(*args,**kwargs) #就是在运行test() func(*('王强'),**{'age':18}) stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return res return wrapper @timmer def test(name,age): time.sleep(3) print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age)) return '这是test的返回值' res=test('王强',age=18) #就是在运行wrapper print(res)
运行结果为:
test函数运行完毕,名字是【王强】 年龄是【18】
运行时间是3.000087261199951
这是test的返回值
user_list=[ {'name':'王强','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] current_dic={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): if current_dic['username'] and current_dic['login']: res = func(*args, **kwargs) return res username=input('用户名:').strip() passwd=input('密码:').strip() for user_dic in user_list: if username == user_dic['name'] and passwd == user_dic['passwd']: current_dic['username']=username current_dic['login']=True res = func(*args, **kwargs) return res else: print('用户名或者密码错误') return wrapper @auth_func def index(): print('欢迎来到京东主页') @auth_func def home(name): print('欢迎回家%s' %name) @auth_func def shopping_car(name): print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','饮料','糖果')) index() home('王强') shopping_car('王强')