# 装饰器
'''
特点:
1.函数a是作为参数出现的,函数b接收函数a作为参数
2.要有闭包的特点
定义一个装饰器:
def decorate(func):
a = 100
def wrapper():
print('------------->1')
func()
print('------------->2',a)
return wrapper
'''
'''
加入购物车
判断用户登陆状态:
# '''
# def func(number):
# a =100
# def inner_func():
# nonlocal a
# nonlocal number
# number += 1
# nonlocal a
# for i in range(number):
# a += 1
# print('修改后:',a)
# return inner_func
#
# #调用
# f = func(5)
# f()
#
# #函数作为参数
# a = 50
# f1 = func(a)
# print(f1)
#
# # 地址引用问题
# def test():
# print('------test---------')
# t =test
# t()
#
# def func(f):
# print(f)
# f()
# print('---------->func')
# func(test)
#
#定义一个装饰器
def decorate(house):
a = 100
print('wrapper外层打印测试')
def wrapper():
house()
print('------------->刷漆')
print('------------->铺地板',a)
print('------------->装门')
print('wrapper加载完成.....')
return wrapper
#使用装饰器
@decorate
# 1.将装饰的函数
def house():
print('毛坯房')
house()
# 1.house被装饰函数
# 2.将被装饰函数作为参数传给装饰器decorate
# 3.执行decorate函数
# 登陆校验
# 装饰器
import time
def decorate(func):
def wrapper(*args,**kwargs):
print('正在校验...')
time.sleep(2)
print('校验完毕...')
func(*args,**kwargs)
return wrapper
@decorate
def f1(n):
print('-----------f1-------------')
f1(5)
@decorate
def f2(name,age):
print('-----------f2-------------')
f2(5,20)
@decorate
def f3(students,clazz='2020'):
print('{}班级的学生如下'.format(clazz))
for stu in students:
print(stu)
students= ['tom','alias','lucy']
f3(students,clazz='1998')
@decorate
def f4():
print('-----------f4------------')
f4()
# 装饰器
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()
# 装饰器参数
# 三层,最外层负责接收装饰器的参数,里面内容还是原来的装饰内容
# 就是在之前外面套了一层
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))
@outer(a=100)
def street():
print('--------***-------')
house('2020-2-2')
street()
# 开发:登陆验证
import time
islogin = False # 默认是没有登陆
#定义一个登陆函数
def login():
username = input('输入用户名:')
password = input('输入密码:')
if username == 'admin' and password == '12345':
return True
else:
return False
# 定义一个装饰器,进行付款验证
def login_required(func):
def wrepper(*args, **kwargs):
global islogin
print('--------------登陆--------------')
# 验证用户是否登陆
if islogin:
func(*args, **kwargs)
else:
# 跳转到登陆页面
print('用户没有登陆,不能付款')
islogin = login()
print('result:',islogin)
return wrepper
@login_required
def pay(money):
print('正在付款,付款金额是{}'.format(money))
print('付款中...')
time.sleep(2)
print('付款成功')
# 调用
pay(10000)
pay(10000)