84.装饰器

# 装饰器
'''
特点:
    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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值