目录
装饰器
#装饰器,反复的验证状态,从而判断是否继续下一步。经常用来判断用户的登陆状态。比如flask,他的很多东西都是装饰器
#装饰器依赖闭包
def test():
print ('>>>text>>>')
#类比 a=10 b=a ,a=0是声明整数 b=a是声明函数。
def alex(t):
print (t)
test()
print ('alex>>>>>alex')
a=test
a()
print ('华丽的分割线')
alex(a)
#装饰器特点:1.函数必须是作为参数传递给另外一个函数、 2.必须要有闭包的特点
#解释器函数规则
#作用域 LEGB
#L ;locale,比如定义了一个函数,再调用一个函数时,他会先在这个定义的域名内找
#E ;嵌套,如果没找到,他会去找外面嵌套他的那一层有没有
#G: global,如果还没有,他会找全局变量中有没有
#B : built-in,如果还没有,他会找内置函数有没有。如果内置还找不到就报错了
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#定义一个装饰器
import time
def decorate(func):
a=100
print ('wrapper 打印测试')
def wrapper():
func()
print ('刷漆')
print ('铺地板')
print ('正在校验')
print ('wrapper 加载完成')
time.sleep(2)
print ('校验完成')
#调用原函数
func()
return wrapper
#使用装饰器
@decorate
def hourse():
print ('---f1---')
hourse()
#在@在谁上面,谁就是被装饰函数。hourse是被装饰函数
#步骤
# 1;看到@,hourse被定义是被装饰函数。
# 2将被装饰函数作为参数传给decorate
# 3,执行decorate函数。
# 4.将返回值赋值给hourse,此时他只是hourse的一层皮,里面其实是wrapper
print (hourse)
hourse()
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#定义一个毛坯房,来了两个装修公司
#如果装饰器是多层,谁离装饰器最近,就优先使用哪个装饰器。
def zhuangxiu1(func):
print ('>'*20+'1start')
def wrapper(*args,**kwargs):
func()
print ('喷漆')
print ('>'*20+'1end')
return wrapper
def zhuangxiu2(func):
print ('>'*20+'2start')
def wrapper(*args,**kwargs):
func()
print ('装门')
print ('>'*20+'2end')
return wrapper
#哪个离着hourse近,他就会先执行哪一个
@zhuangxiu2
@zhuangxiu1
def hourse():
print ('我是毛坯房')
hourse()
#他会先把装修,把hourse 复制给func.给第一步 func=hourse ,然后加载wrapper,打印出 1start 1end。然后扔出wrapper,赋值给hourse
#到第二层wrapper,func就是继承了上面第一层的wrapper加载第二层的wrapper,并赋值给hourse,这时候,hourse是第二层的wrapper
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
def zhuangxiu1(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
print ('铺砖')
return wrapper
@zhuangxiu1
def hourse(time):
print ('{}我是毛坯房' .format(time))
hourse('2020-6-12')
#带参数的装饰器是三层的
#最外层的函数接收装饰器参数,第二层接收函数的 第三层,负责接收函数的实参的
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# BY:wenchao.li time: 2020/7/9
#模拟付款,要随时查询用户是否在线,所以谢一个装饰器
import time
islogin=False
def login():
user=input('please input user:')
password=input('please input pass')
if user=='admin' and password=='123456':
return True
else:
return False
def login_required(func):
def wrapper(*args,**kwargs):
global islogin
if islogin:
func(*args,**kwargs)
else:
#跳转到登录界面
islogin=login()
print ('result',islogin)
return wrapper
@login_required
def pay(money):
print ('正在付款,付款金额是:{}' .format(money))
print ('付款中...')
time.sleep(2)
print ('付款完成')
pay(1000)
#第一次付款,调用login_requied,发现islogin=False,然后调用login,login后修改了全局变量,
# islogin=True,当再次pay(8000)的时候查到islogin=True,所以会只有8000付款成功
pay(8000)