千峰#1.11.7
# 地址引用 a = 10 # 声明整型变量 b = a def test(): # 声明函数 print('------test------') t = test # test() # t() def func(f): # f=test print(f) # <function test at 0x0000019DE6A27550> f() # ------test------ print('------>func') # 调用 func(test) ''':cvar 特点: 1. 函数A是作为参数出现的(函数B就接收函数A作为参数) 2. 要有闭包的特点 ''' # 定义一个装饰器 def decorate(func): a = 100 def wrapper(): print('------->111111') func() print('------->222222') print(a) return wrapper # # 使用装饰器 # # @decorate # def house(): # print('我是毛坯房......') # # # def house1(): # house() # print("刷漆") # print("铺地板") # # # # 抵用函数house # house() # house1() # 使用装饰器 def decorate(func): a = 100 print('wrapper外层打印测试') def wrapper(): print('------->刷漆') print('------->铺地板', a) print('------->装门') print('wrapper加载完成......') return wrapper # 默认house接收wrapper函数 # 使用装饰器 @decorate # 加载到内存 def house(): # 把house当成func传给decorate print('我是毛坯房......') ''':cvar 1、house()被装饰函数 2、将被装饰函数作为参数传给装饰器decorate 3、执行decorate函数 4、将返回值又赋值给house ''' # def house1(): # house() # print("刷漆") # print("铺地板") print(house) house()
--------------------------------------------------------------------
# 登陆校验 import time def decorate(func): def wrapper(x): print('正在校验中......') time.sleep(2) print('校验完毕...') # 调用原函数 func(x) # f1 f2 f3... return wrapper @decorate def f1(n): print('-----f1------', n) @decorate def f2(name): print('-----f2------', name) @decorate def f3(students): for stu in students: print(stu) f1(5) # 此时的f1是wrapper, f2('lily') f3([1,2,3,4,5])
--------------------------------------------------------------------------------------------------
# 登陆校验 import time def decorate(func): def wrapper(*args, **kwargs): # () {'clazz':1904} print('正在校验中......') time.sleep(2) print('校验完毕...') # 调用原函数 func(*args, **kwargs) # f1 f2 f3... return wrapper @decorate def f1(n): print('-----f1------', n) @decorate def f2(name, age): print('-----f2------', name) @decorate def f3(students, clazz='1905'): print('{}班级的学生如下:'.format(clazz)) for stu in students: print(stu) @decorate def f4(): print('--------------->f4') f1(5) # 此时的f1是wrapper, f2('lily', 20) f3([1, 2, 3, 4, 5], clazz='1904') f4()
-----------------------------------------------------------------------------------
多层装饰器
''':cvar 如果装饰器是多层的,谁距离函数最近就优先使用哪个装饰器 ''' # 装饰器 def zhuang1(func): print('-------->1 start') def wrapper(*args, **kwargs): func() print('刷漆') print('------>1 end') return wrapper def zhuang2(func): print('-------->2 start') def wrapper(*args, **kwargs): func() print('铺地板,装门...') print('------>2 end') return wrapper @zhuang2 @zhuang1 def house(): print('我是毛坯房') house()
--------------------------------------------------------------------------------------
带参数的装饰器
# 装饰器带参数 在 VS, PYCHARM 中只要 拉选块之后,按下tab键,整个块就会缩进 ''':cvar 带参数的装饰器是三层的 最外层的函数负责接收装饰器参数 里面的内容还是原装饰器的内容 ''' def outer(a): # 第一层:负责接收装饰器参数的 def decorate(func): # 第二层:负责接收函数的 def wrapper(*args, **kwargs): # 第三层:负责接收函数的参数 func(*args, **kwargs) print('--->铺地砖...{}块'.format(a)) return wrapper # 返出来的是:第三层 return decorate # 返出来的是:第二层 @outer(10) def house(time): print('我{}日期拿到房子的钥匙,是毛胚房...'.format(time)) @outer(100) def street(): print('新修街道名字是:黑泉路') house('2019-6-12') street()
-------------------------------------------------------------------------------
装饰器应用
# 开发:登陆验证 import time islogin = False # 默认没有登陆 # 定义一个登陆函数 def login(): username = input('输入用户名:') password = input('输入密码') if username == 'admin' and password == '123456': return True else: return False # 定义一个装饰器,进行付款验证 def login_required(func): def wrapper(*args, **kwargs): global islogin print('---付款---') # 验证用户是否登陆 if islogin: func(*args, **kwargs) else: # 跳转到登陆页面 print('用户没有登陆,不能付款!') islogin = login() print('result', islogin) if (islogin): func(*args, **kwargs) return wrapper @login_required def pay(money): print('正在付款,付款金额是:{}元'.format(money)) print('付款中...') time.sleep(2) print('付款完成') # 调用付款 pay(10000) pay(8000)