装饰器;函数装饰器是Python中的一种特殊的函数,它可以用来修改、增强或者包装其他函数的功能。函数装饰器接受一个函数作为参数,并返回一个函数。通过使用函数装饰器,可以在不修改原函数代码的情况下,在其前后或者中间添加一些额外的功能或者行为。
器:指的是工具
装饰:添加功能
装饰器的核心思想:在不改变原来的调用方式和内部代码的基础上来添加功能
装饰器的固定模版有个口诀:客人空手来,还得请上楼;干啥都同意,有参给上楼.
##:客人(fucn)空手来,还得请上楼(index里的func);干啥都同意(输入的是*args,**kwargs),有参给上楼(f1所在的括号里).
def index(func):
def f1(*args, **kwargs):
print('开始执行')
res = func(*args, *kwargs)
print('执行完毕')
return res
return f1
1. 语法糖的书写规范:
? ? @装饰器名字
? ? 必须把上面的写在被装饰对象的头上(紧贴着被装饰对象写)
def index(func):
def info():
print('开始执行')
res = func()
print('执行结束')
return res
return info
@index
def origin():
print('函数')
origin()
? ??
2. 语法糖的原理:
? ? 它会把下面的被装饰对象的名字当成参数传递给装饰器
import time
def index():
time.sleep(2)
print('小李')
def home(name):
time.sleep(2)
print('志乃')
def outer(func):
def outer(func):##func:index func = home
def get_time(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print(end_time-start_time)
return get_time
func = outer(func)
func()
import time
def index():
time.sleep(2)
print('小李')
def home(name):
time.sleep(2)
print('志乃')
def outer(func):
def get_time(*args,**kwargs):
start_time = time.time()
res= func(*args,**kwargs)
end_time = time.time()
print(end_time-start_time)
return res
return get_time
home = outer(home)
res =home('jerry')
print(res)
我们现在统计函数有时需要参数,有时不需要,所以当我们不确定要不要传参数时,使用*args和**kwargs
import time
def outer(func):
def get_time(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return res
return get_time
def login_auth(func):
def auth():
username = input('账号').strip()
password = input('密码').strip()
if username == 'kiki' and password == '123':
print('登录成功')
func()
else:
print('登录失败')
return auth
@login_auth
@outer
def index():
time.sleep(2)
print('form index')
index()
注: 双层语法糖的顺序为定义时从上而下的,而调用时是从下往上
和双层语法糖一样,不过当最后的语法糖调用时,使用的则是最初的函数
def outer1(func1):
print('outer1')
def weeper1(*args, **kwargs):
print('weeper1')
res = func1(*args, **kwargs)
return res
return weeper1
def outer2(func2):
print('outer2')
def weeper2(*args, **kwargs):
print('weeper2')
res2 = func2(*args, **kwargs)
return res2
return weeper2
def outer3(func3):
print('outer3')
def weeper3(*args, **kwargs):
print('weeper3')
res3 = func3(*args, **kwargs)
return res3
return weeper3
@outer3
@outer2
@outer1
def index():
print('form index')
index()
def outer(source_type, *a, **k):
def login_auth(func):
def auth(*args, **kwargs):
username = input('请输入你的账号')
password = input('请输入你的密码')
if source_type == 'file':
print('获取密码')
if username == 'kiki' and password == '123':
print('登录成功')
func(source_type, *args, **kwargs)
else:
print('登录失败')
return auth
return login_auth
@outer('file')
def home(*a, **b):
pass
home('lll')