装饰器(第二部分)

双层语法糖

def outer1(func):
    def inner1():
        print('inner')
        func()
    return inner1

def outer2(func):
    def inner2():
        print('inner2')
        func()
    return inner2
'''
双层语法糖执行顺序是自下而上执行的,也就是先执行outer2再执行outer1
'''
@outer1 #index=outer1(inner2)  inner1的内存地址
@outer2 #outer1=outer2(index)  inner2的内存地址

def index():
    print('index')
index()

三层(多层)语法糖

# def outer1(func):
#     def inner1():
#         print('inner')
#         func()
#     return inner1
#
# def outer2(func):
#     def inner2():
#         print('inner2')
#         func()
#     return inner2
# '''
# 双层语法糖执行顺序是自下而上执行的,也就是先执行outer2再执行outer1
# '''
# @outer1 #index=outer1(inner2)  inner1的内存地址
# @outer2 #outer1=outer2(index)  inner2的内存地址
#
# def index():
#     print('index')
# index()




# 多层语法糖练习
def outer1(func1):
    print('打印outer1')
    def wrapper1(*args,**kwagrs):
        print('打印wrapper1')
        func1(*args,**kwagrs)
    return wrapper1

def outer2(func2):
    print('打印outer2')
    def wrapper2(*args,**kwargs):
        print('打印wrapper2')
        func2(*args,**kwargs)
    return wrapper2

def outer3(func3):
    print('打印outer3')
    def wrapper3(*args,**kwargs):
        print('打印wrapper3')
        func3(*args,**kwargs)
    return wrapper3
@outer1 #index=outer1(wrapper2)
@outer2 #outer1=outer2(wrapper3)
@outer3 #outer2=outer3(index)
def index():
    print('index')
index()

有参装饰器

了解无参装饰器之后,我们需要为被装饰对象添加一个认证来源的装饰器,如下:

def outer1(func1):#source_type没有参数传入就会报错!
    def inner1(*args,**kwargs):
        if source_type == 'file':
            print('文件中获取用户名和密码')
        elif source_type == 'mysql':
            print('从MySQL中获取用户名和密码')
        elif source_type == 'oracle':
            print('从oracle中获取用户名和密码')
        elif source_type == 'postgresql':
            print('从postgresql中获取用户名和密码')
    return inner1

@outer1
def index(a,b,c):
    print('index')
index(1,2,3)

这时候就要想办法把参数再传入 ,就要再嵌套一层

def wrapper(source_type,*args1,**kwargs2):
    def outer1(func1):
        def inner1(*args,**kwargs):
            if source_type == 'file':
                print('文件中获取用户名和密码')
            elif source_type == 'mysql':
                print('从MySQL中获取用户名和密码')
            elif source_type == 'oracle':
                print('从oracle中获取用户名和密码')
            elif source_type == 'postgresql':
                print('从postgresql中获取用户名和密码')

            func1(*args, **kwargs)
        return inner1
    return outer1

@wrapper('file')
def index(a,b,c):
    print('index')
index(1,2,3)
@wrapper('mysql') #home=wrapper(home,'mysql')
def home():
    pass
home()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值