双层语法糖
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()