Python之装饰器
一、装饰器
本质就是函数,功能是为其他函数添加附加功能
二、原则
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
三、装饰器 = 高阶函数 + 函数嵌套 +闭包
1.高阶函数:
①函数接收的参数是一个函数名
②函数的返回值是一个函数名
③满足上述条件任意一个,都可以称之为高阶函数
*** 高阶函数示范 ***
*** 把函数当成参数传给高阶函数 ***
*** 函数返回值是函数名 ***
# 函数接收的参数是一个函数名
def say_hi(): import time print('欢迎光临') time.sleep(3) print('谢谢惠顾') def test(func): import time print(func) #输出的是函数的地址 start_time = time.time() func() stop_time = time.time() print('函数运行时间是%s' %(stop_time-start_time)) test(say_hi)
#函数的返回值是一个函数名
def say_hi(): import time print('欢迎光临') time.sleep(3) print('谢谢惠顾') def test(func): return func res = test(say_hi) print(res) say_hi()
# 高阶函数总结:
1)函数接收的参数是个函数名
作用:在不移动函数源代码的前提下,为函数添加新功能
不足:会改变函数的调用方式
2)函数的返回值是一个函数名
作用:不修改函数的调用方式
不足:不能添加新功能
四、装饰器的框架
def test(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res return wrapper()
五、使用案例-计算函数运行时间
import time def JiShi(f): def wapper(*args,**kwargs): start_time = time.time() res = f(*args,**kwargs) stop_time = time.time() print('函数运行时间是:%s' %(stop_time - start_time)) return res return wapper def JiShi_mistake(f): #使用这个会报错,因为函数的参数没有进入 def wapper(): start_time = time.time() res = f() stop_time = time.time() print('函数运行时间是:%s' % (stop_time - start_time)) return res return wapper @JiShi def test(name,age): import time time.sleep(1) print('test函数运行完毕...\n名字是:%s \n年龄是:%s' %(name,age)) return '这是test的返回值' j = test('alex',18) print(j)
六、使用案例-网页账号密码登录验证
#!/usr/bin/env python # -*- coding:utf8 -*- ''' 为了在进入网站登录一次后,让用户不用多次输入账号密码 让机器记住登录状态,可以让用户不用多次登录 #### 第一种样式 #### # 判别一个账号 ==》 设置全局变量: user_dic = {'user_name':None,'login':False} ==》 在装饰器前面加上: if user_id['user_name'] and user_id['login']: res = func(*args,**kwargs) return res ==》在判断账号密码是否正确的if里面加上: user_id['user_name'] = user_name user_id['login'] = True #### 第二种样式 #### # 判别多个账号 ==》定义全局变量 用户信息列表(内部放字典) 和 当前登录状态 user_list = [ {'name':'alex','passwd':'123'}, {'name':'kajsd','passwd':'123'}, {'naem':'sfsa','passwd':'123'}, {'name':'aasd','passwd':'123'}, ] current_dic = {'user_name':None,'login':False} ==》 判断当前状态 if current_dic['user_name'] and current_dic['login']: # 即 current_dic['user_name'] 和 current_dic['login'] 都不为空,或Fla时 res = func(*args,**kwargs) return res ==》将 if user_name == '产品经理' and passwora == '123456': 部分 全部改写成 for 循环,遍历 用户信息列表 ''' # #### 第一种样式 #### # user_dic = {'user_name':None,'login':False} # # def quth_func(func): # def wrapper(*args,**kwargs): # if user_dic['user_name'] and user_dic['login']: # # 即 user_dic['user_name'] 和 user_dic['login'] 都不为空,或Fla时 # res = func(*args,**kwargs) # return res # user_name = input('用户名:').strip() # password = input('密码:').strip() # if user_name == '产品经理' and password == '123456': # user_dic['user_name'] = user_name # user_dic['login'] = True # res = func(*args,**kwargs) # return res # else: # print('用户名或密码错误') # return wrapper #### 第二种样式 #### user_list = [ {'name':'alex','passwd':'123'}, {'name':'kajsd','passwd':'123'}, {'naem':'sfsa','passwd':'123'}, {'name':'aasd','passwd':'123'}, ] current_dic = {'user_name':None,'login':False} def quth_func(func): def wrapper(*args,**kwargs): if current_dic['user_name'] and current_dic['login']: # 即 current_dic['user_name'] 和 current_dic['login'] 都不为空,或Fla时 res = func(*args,**kwargs) return res user_name = input('用户名:').strip() password = input('密码:').strip() for user_dic in user_list: if user_name == user_dic['name'] and password == user_dic['passwd']: current_dic['user_name'] = user_name current_dic['login'] = True res = func(*args, **kwargs) return res else: # else 跟 for 连接在一起 print('用户名或密码错误') return wrapper @quth_func def home(name): print('欢迎回家%s' %name) @quth_func def index(): print('欢迎来到主页') @quth_func def shopping_cai(): print('购物车里有 %s,%s,%s' %('牛奶','面包','零食')) home('产品经理') shopping_cai() index()
作者:Jony·Li
来源:https://www.cnblogs.com/lzn-2018/
版权声明:本文为博主原创文章,转载请附上博文链接!