Python---装饰器

千峰#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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值