装饰器的概念器
# 装饰器是由之前我们学习的名称空间、函数嵌套、闭包函数等知识点汇总而来
2、核心思想:在’不改变原来的调用方式’和’内部代码‘的基础之上给函数‘添加额外的功能’.
def index(): pass # 不改变 index()
# 时间戳:time.time() ,从1970-1-1到当前时间的秒数
# 睡眠:time.sleep()
def index(): time.sleep(3) print('from index') # 1. 在执行函数之前加一个时间点 start_time = time.time() # 此时的时间戳 index() end_time = time.time() # 2. 等index函数执行之后在打个时间点 print('index一共执行了%s秒' % (end_time - start_time)) # 3. 获取index 的总执行时间
装饰器的简易版本
import time def index(): time.sleep(3) print('from index') def home(): time.sleep(1) print('from home') def outer(func): def get_time(): start_time = time.time() func() # 只能够统计index函数的时间 end_time = time.time() print('执行时间:%s' % (end_time - start_time)) return get_time index = outer(index) # res:get_time的函数名(其实也是get_time的内存地址) index() # get_time() # res = outer(home) # res()
装饰器进阶版本(重要)
def outer(func): # func:index # func = home def get_time(*args, **kwargs): # func:index start_time = time.time() # index() # 只能够统计index函数的时间 # func()---->index() # func:home res=func(*args, **kwargs) # 只能够统计index函数的时间 end_time = time.time() print('执行时间:%s' % (end_time - start_time)) # return res # 其实返回的是上面index的返回值 return res return get_time home = outer(home) res=home('jerry') # get_time('jerry') print(res)
装饰器练习题(认证登录功能)
# 必须登录之后才能够访问函数 def index(): print('from index') def home(): print('from home') def home1(): print('from home1') # index() # 用户必须是登录之后才能访问,否则不让访问 is_login={'is_login':False} # 1. 写一个登录程序 def outer(func): # func = index def auth(): if is_login.get('is_login'): ## 如果条件成立,直接执行函数 res=func() return res # 解决返回值问题的 username = input('username:>>>').strip() password = input('password:>>>').strip() # 2. 比较用户名和密码 if username == 'jerry' and password == '123': # 执行函数 print('登录成功') func() is_login['is_login'] = True # else: print('用户名或者密码错误') return auth index=outer(index) index() home=outer(home) home() home1=outer(home1) home1() """只要登录成功一次,后续的函数就不用在登录了"""
装饰器的固定模板
def outer(func): def inner(*args, **kwargs): print('函数被调用之前需要添加的功能') res = func(*args, **kwargs) # 真正的函数执行 print('函数被调用之后需要添加的功能') return res return inner index = outer(index) # index() res = index # 语法糖 print(res)
语法糖
1、语法糖的原理:它会把下面的被装饰对象的名字当成参数传递给装饰器
@outer # index = outer(index) def index(): print('from index') return 'index' def outer(func): def inner(*args, **kwargs): print('函数被调用之前需要添加的功能') res = func(*args, **kwargs) # 真正的函数执行 print('函数被调用之后需要添加的功能') return res return inner index()
今日思维导图:
原文地址:https://blog.csdn.net/qq_48064830/article/details/132760061
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_3222.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。