提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、装饰器的定义
'''
装饰器
加入购物车,付款,修改收货地址.
判断用户的登录状态,
'''
def func(number):
a=100
def inner_func():
nonlocal a
nonlocal number
number+=1
for i in range(number):
a+=1
print('修改后的a',a)
return inner_func
#调用func
f=func(6)
f()
#函数作为参数
a = 50
f1=func(a) #实参a是一个实参
print(f1)
#地址引用
a=10 #声明整型变量
b=a
def test(): #声明函数
print('------test------')
t=test
#test()
#t()
def func(f):
print(f) #<function test at 0x031DD978>
f()
print('--------->func')
#调用
func(test)
二、装饰器的使用
#登录校验
import time
def decorate(func):
def warpper(*args,**kwargs): #()
print('正在校验中....')
time.sleep(2)
print('校验完毕')
#调用原函数
func(*args,**kwargs)
return warpper
@decorate
def f1(n):
print('-------f1-------',n)
f1(5)
@decorate
def f2(name,age):
print('-------f2-------',name,age) #() {'clazz':'1904'}
f2('lily',12)
@decorate
def f3(students,classs='1905'):
print('{}班级的学生如下:'.format(classs))
for stu in students:
print(stu)
students=['lily','tom','aq']
f3(students,classs='1904')
三. 多层装饰器
'''
如果装饰器是多层的,谁距离函数最近就优先使用哪个装饰器
'''
#装饰器
def zhuang1(func):
print('---------->1 start')
def wrapper(*args,**kwargs):
func()
print('刷漆')
print('-------->2 end')
return wrapper
def zhuang2(func):
print('---------->1 start')
def wrapper(*args,**kwargs):
func()
print('搬砖,装门窗')
print('-------->2 end')
return wrapper
@zhuang2
@zhuang1
def house():
print('我是毛坯房.....')
house()
四 装饰器带参数
#装饰器带参数
'''
带参数的装饰器是三层的
最外层的函数负责接收装饰器参数
Kim的内容还是原装饰器的内容
'''
def outer(a): #第一层 ,负责接收装饰器的参数
def decorate(func): #第二层,负责接收函数的
def wrapper(*args,**kwargs): #第三层 负责接收函数的参数
func(*args)
print('------>铺地砖{}.'.format(a))
return wrapper #返出来的是,第三层
return decorate #返出来的是,第三层
@outer(a=10)
def house(time):
print('我{}日期拿到房子,是毛坯房'.format(time))
house('2021-10-13')
@outer(100)
def street():
print('新修街道的名字是,黑泉路')
street()
六,案例 登录验证脚本
v#开发,登录验证
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
#验证用户是否登录
if islogin:
func(*args,**kwargs)
else:
# 跳转到登录页面
print('用户没有登录,不能付款')
islogin=login()
print('result',islogin)
return wrapper
@login_required
def pay(money):
print('正在付款,付款金额是:{}元'.format(money))
print('付款中.....')
time.sleep(2)
print('付款完成!')
#调用
pay(10000)
pay(8000)
总结
a=100
def func():
a=10
def inner_func():
a=1
print(a)
#inner_func()
return inner_func
#调用外部函数
f=func()
f()
def zhuang(func):
def wrapper(*args,**kwargs):
func()
print('-------')
return wrapper
@zhuang
def f1 ():
pass
函数:
作用域:LEGB
L:local 本地 局部变量
E: encloseing 嵌套
G: Global 全局
B:built-in 内置的
嵌套函数:
闭包:
1.内层函数
2.内层函数引用外层函数的变量
3.返回内层函数
装饰器:
1.内层函数
2.内层函数引用外层函数的变量
3.返出内层函数
4.函数作为外层函数参数
使用装饰器
@装饰器的名字
def 函数名():
pass