day14——装饰器
day14
装饰器
装饰器本质就是闭包
开放封闭原则:
扩展是开放的(增加新功能),对源码是封闭的(修改已经实现的功能)
装饰器:用来装饰的工具
作用:在不改变源代码及调用方式的基础下额外增加新的功能
应用(面试的时候): 登录认证、日志
增加一些功能
校验用户登录的时候
面向对象
语法糖 -- 甜:@+函数名
语法糖必须放在被装饰的函数正上方
# import time
# def times(f):
# def inner():
# start_time = time.time()
# f()
# print(time.time() - start_time)
# return inner
# def foo():
# time.sleep(1)
# print('我是立业,我快!')
# foo = times(foo)
# foo()
# def wrapper(f):
# def inner(*args,**kwargs):
# f(*args,**kwargs)
# return inner
# def func(*args,**kwargs):
# print(f"这是{args,kwargs}函数")
# func = wrapper(func)
# func('alex','sir')
版一
# import time
# start_time = time.time()
# def func():
# time.sleep(1)
# print('我要飞')
# func()
# print(time.time() - start_time)
版二
# def times(f):
# start_time = time.time()
# f()
# print(time.time() - start_time)
#
# def foo():
# time.sleep(1)
# print('小明')
#
# def func():
# time.sleep(1)
# print('章超印')
# s = func
# func = times
# func(s)
# s = foo
# foo = times
# foo(s)
版三
# def times(f):
# def inner():
# start_time = time.time()
# f()
# print(time.time() - start_time)
# return inner
#
# def foo():
# time.sleep(1)
# print('小明')
# foo = times(foo)
# foo()
# def wrapper():
# def inner():
# print(1)
# return inner
# wrapper()()
# def wrapper():
# def inner(f):
# print(f)
# return inner
#
# def func():
# print('小明')
# func = wrapper()
# func('alex')
版四
# def wrapper(f):
# def inner(*args,**kwargs):
# f(*args,**kwargs)
# return inner
# def func(*args,**kwargs):
# print(f'{args,kwargs}')
# func = wrapper(func)
# func(1,2,2,3,4,5,5,a=1,b=2)
# import time
# def wrapper(f):
# def inner(*args,**kwargs):
# start_time = time.time()
# f(*args,**kwargs)
# print((time.time() - start_time))
# return inner
# def func(*args,**kwargs):
# print(f'{args,kwargs}')
# time.sleep(1)
# func = wrapper(func)
# func(1,2,3,4,54,5,a = 1, b =2)
版五
# import time
# def wrapper(f):
# def inner(*args,**kwargs):
# start_time = time.time()
# print(f(*args,**kwargs))
# return time.time() - start_time
# return inner
# @wrapper
# def func(*args,**kwargs):
# time.sleep(1)
# print(f'{args,kwargs}')
# return 'alex'
# @wrapper
# def foo(*args,**kwargs):
# time.sleep(1)
# print(f'{args,kwargs}')
# print(func(1,2,3,4,54,5,a = 1, b =2))
# print(foo(1523,2,541,5165,12,6,a='alex',b='eeeee'))
标准版
def func(a): #a是要被装饰的函数名
def foo(*args,**kwargs):
"装饰之前的操作"
ret = a(*args,**kwargs)
"装饰之后的操作"
return ret
return foo
@func
def f1(*args,**kwargs):
print(f"这是一个{args}")
return "我可以返回了"
print(f1(1,2,3,34,4,5,a=1))
博客园
# login_dic = {
# "username": None,
# "flag": False
# }
# def auth(f):
# def inner(*args,**kwargs):
# if login_dic["flag"]:
# return f()
# else:
# return login()
# return inner
# @auth
# def index():
# print(f"这是{login_dic['username']}主页")
# return "主页没有内容"
# def login():
# print("这是一个登录页面")
# user = input("username:")
# pwd = input("password:")
# if user == "baoyuan" and pwd == "baoyuan123":
# login_dic["flag"] = True
# login_dic["username"] = user
# return "登录成功!"
# else:
# return "用户名或密码错误!"
# @auth
# def comment():
# print(f"这是{login_dic['username']}评论")
#
# while not login_dic["flag"]:
# print(comment())
day14——装饰器的更多相关文章
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
- day14 装饰器
装饰器 本质上就是函数,功能是为其他函数添加附加功能 原则:不修改被修饰函数的源代码,以及调用方式,即完全不能有任何改变 装饰器 = 高阶函数+ 函数嵌套+ 闭包 高阶函数:函数作为参数或者返回一个函 ...
- day14 装饰器模拟验证附加功能
user_list=[ {'}, {'}, {'}, {'}, ] current_dic={'username':None,'login':False} def auth_func(func): d ...
- day14 带参装饰器、迭代器、生成器
""" 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及w ...
- day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...
- day-14带参装饰器、迭代器
带参装饰器 通常,装饰器为被装饰的函数添加新功能,需要外界的参数 -- outer参数固定一个,就是func -- inner参数固定同被装饰的函数,也不能添加新参数 -- 可以借助函数的嵌套定义, ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- day14(带参装饰器,迭代器,生成器,枚举对象)
一,复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
- python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题
1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...
随机推荐
- WinDbg常用命令系列---sx, sxd, sxe, sxi, sxn, sxr, sx- (设置异常)
简介 sx*命令控制调试器在正在调试的应用程序中发生异常或发生某些事件时采取的操作. 使用形式 sx sx{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2 ...
- Traefik 2.0 tcp 路由试用
对于tcp 的路由是基于sni (需要tls)但是可以通过统配(*) 解决不试用tls的,当然也可以让Traefik 自动生成tls 证书 以下是测试http 以及mysql 的tcp 路由配置(de ...
- 5-微信小程序开发(小程序页面跳转和布局说明)
https://www.cnblogs.com/yangfengwu/p/11605209.html 新建一个小程序 咱现在新建个页面 在pages 上右击,选择新建目录 会自动添加这几个文件 现在做 ...
- ubuntu 安装任何版本的Firefox
https://ftp.mozilla.org/pub/firefox/releases/ 1.sudo gedit /usr/share/applications/firefox.desktop 2 ...
- html在div中显示滚动条
基本思路:滚动条要添加到内容部分的父标签上(div),内容部分不设置大小,父标签要明确设置大小,并且父标签要添加overflow样式,并设置成auto. 打开的效果如下: 这时可能有人会问,父div的 ...
- Refused to execute script from '...' because its MIME type ('') is not executable, and strict MIME type checking is enabled.
写在前面 部署项目到weblogic上启动首页访问空白, 浏览器控制台报如题错误. web.xml中把响应头添加防止攻击的报文过滤器禁用就行了(仅仅是为了启动), 以下为转载内容, 可以根据需要自行测 ...
- JVM探究之 —— 垃圾回收(一)
垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和 ...
- JS实现统一社会信用代码的效验(组织机构代码效验)
参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...
- CRM 负责人 选择
CRM 负责人 参与 - 搜狗搜索https://www.sogou.com/sgo?query=CRM+%E8%B4%9F%E8%B4%A3%E4%BA%BA+%E5%8F%82%E4%B8%8E& ...
- java合并多个word 2007 文档 基于docx4j
参考文章:http://dh.swzhinan.com/post/185.html 引入的jar包 <dependency> <groupId>org.docx4j</g ...