装饰器的重要内容
functools.wraps
带参数的装饰器
多个装饰器装饰同一个函数 一.编写一个装饰器,为多个函数添加登陆认证的功能。具体:只需要登录一次,后面被装饰的函数不需要重新登陆。
FLAG = False
def wrapper(f):
def inner(*args,**kwargs):
global FLAG
if FLAG == True:
ret = f(*args, **kwargs)
return ret
else:
username = input('username:')
password = input('password:')
if username == 'daxiong' and password == '':
FLAG = True
ret = f(*args,**kwargs)
return ret
else:
print('登陆失败')
return inner
@wrapper
def a():
return '今晚中大奖' @wrapper
def b():
return '奖金八百万' print(a())
print(b()) 二.带参数的装饰器:
def wrapper(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
@wrapper
def func():
return '双色球中奖800万' #.__name__是求出字符串格式的函数名,用于文件操作。
print(func.__name__) #因为func=inner,执行func相当于执行inner,所以执行结果是inner from functools import wraps #加上这句话以及 @wraps(f),print(func.__name__)的执行结果是func.否则就是inner。
def wrapper(f):
@wraps(f) #带参数的装饰器,带参数的语法糖。
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
@wrapper
def func():
return '双色球中奖800万'
print(func.__name__) #执行结果是func 三.带参数的装饰器,装饰多个函数,方便好用。FLAG相当于开关,当开关是True,被装饰的函数走的是计算时间的通道,当开关是False时,走另外一条通道。
FLAG = True #使用全局变量,True时,所有函数都被装饰,否则不被装饰。
import time
def wrapper(fl): #让语法糖带参数(传入全局变量),必须定义一个外层函数。最多三层。三层嵌套函数。
def timmer(f):
def inner(*args,**kwargs):
global FLAG
if FLAG:
start = time.time()
time.sleep(0.01)
ret = f(*args,**kwargs)
end = time.time()
print(end - start)
return ret
else:
print('当FLAG为False时,时间装饰器不起作用')
return inner
return timmer #timmer=wrapper(FLAG)
@wrapper(FLAG) #timmer=wrapper(FLAG),所以@wrapper(FLAG)就是@timmer
def a():
return '我要中双色球一等奖'
@wrapper(FLAG)
def b():
return '奖金800万'
print(a())
print(b())
#注意:带参数的装饰器是三层函数,由参数 FLAG=1,2,其他 来控制选择哪一种功能。

FLAG = 1 #FLAG=1,2,其他
import time def wapper(f1):
def timmer(f):
def inner(*args,**kwargs):
global FLAG
if FLAG == 1:
start = time.time()
time.sleep(0.1)
n = f(*args, **kwargs)
end = time.time()
print(end-start)
return n
elif FLAG == 2:
print('')
n = f(*args, **kwargs)
return n
else:
print('其他')
n = f(*args, **kwargs)
return n
return inner
return timmer @wapper(FLAG)
def f1():
print('f1111') @wapper(FLAG)
def f2():
print('f22222') f1()
f2()
  
 四.使用多个装饰器来装饰同一个函数。用处:记录用户的登录情况,计算这个函数的执行时间。
def wrapper1(f):
def inner():
print('wrapper1 before')
f()
print('wrapper1 after')
return inner
def wrapper2(f):
def inner():
print('wrapper2 before')
f()
print('wrapper2 after')
return inner @wrapper2
@wrapper1
def func():
print('明天继续加油')
func()
#wrapper2 before
#wrapper1 before
#明天继续加油
#wrapper1 after
#wrapper2 after

最新文章

  1. browserify学习总结
  2. SQLServer复制(二)--事务代理作业
  3. CentOS6.5上源码安装MongoDB3.2.1
  4. Linux USB驱动
  5. Java主要有那几种文件类型,各自作用
  6. Shuffle an Array
  7. SQL Server数据库学习总结
  8. Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例
  9. Linux和windows下清除svn保存的账号密码信息
  10. 5W1H分析法
  11. hello world2
  12. hibernate 关于主键
  13. javascript-发布订阅模式与观察者模式
  14. Django 2.0 官方文档翻译
  15. JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程
  16. JavaScript超酷时钟的制作
  17. [译]如何在.NET Core中使用System.Drawing?
  18. Jupyter 同时支持python2, python3
  19. mysql盲注学习-1
  20. 记录weiye项目上线遇到的一些问题

热门文章

  1. vnpy交易接口学习
  2. bzoj4316小C的独立集(dfs树/仙人掌+DP)
  3. python 设置系统/用户环境变量
  4. 【Pytyon模块】logging模块-日志处理
  5. Redhat7 开机启动服务
  6. 2020/1/29 PHP代码审计之XSS漏洞
  7. webpack4+vue 打包 就是没效果?求解!!!
  8. 分糖果(BFS)
  9. 用IMX6开发板创建Android模拟器
  10. Mac技巧-如何切换至 Mac 地图应用的卫星视图模式