装饰器
一、装饰器的定义
二、装饰器的使用
三、装饰器的语法以及最终语法
四、有参有反函数被装饰
五、带参函数被装饰
一、装饰器:
定义:名字上来看,就是用来装饰的东西
从使用上来看,用来‘装饰’其他函数的函数,可以在原先函数功能基础上添加新的功能
""" ef wrap(tag): def fn(): tag() print('绘画:进行观赏') return fn vase = wrap(vase) vase """ def vase(): print('插花') # 下方的函数嵌套结构就是装饰器 def wrap(tag): def fn(): tag() # 原有的vase print('绘画:进行观赏') return fn # 拓展功能后的vase vase = wrap(vase) # 将拓展功能后的功能函数重新赋值给vase
二、装饰器使用原则
1.不能修改被装饰对象(函数)的源代码(封闭)
2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放)
三、基本体和笑笑语法
最终语法:
def wrap(fn):
def inner(*args, **kwargs):
print('前增功能')
result = fn(*args, **kwargs)
print('后增功能')
return result
return inner
@wrap
def fn1():
print('fn1的原有功能')
@wrap
def fn2(a, b):
print('fn2的原有功能')
@wrap
def fn3():
print('fn3的原有功能')
return True
@wrap
def fn4(a, *, x):
print('fn4的原有功能')
return True
fn1()
fn2(10, 20)
fn3()
fn4(10, x=20)
案列:
def wrap(fn):
def inner():
fn()
print('摆放功能')
return inner
# 语法糖 | 笑笑语法
@wrap
@outer # <==> vase = outer(vase)
def vase():
print('插花')
# vase = outer(vase)
vase()
# 增加一个账号处理功能:3位及以上英文字符或汉字
def check_usr(fn):
def inner(usr, pwd):
if not (len(usr) >= 3 and usr.isalpha()):
print('账号验证失败')
return False
result = fn(usr, pwd) # login
return result
return inner
# 增加一个密码处理功能:6位及以上英文和数字
def check_pwd(fn):
def inner(usr, pwd):
if not (len(pwd) >= 6 and pwd.isalnum()):
print('密码验证失败')
return False
return fn(usr, pwd)
return inner
# 登录功能
@check_usr # login = check_usr(login) = inner
@check_pwd
def login(usr, pwd):
if usr == 'abc' and pwd =='123qwe':
print('登录成功')
return True
print('登录失败')
return False
res = login('abc', '123qwe') # inner
print(res)
# 了解
def outer(input_color):
def wrap(fn):
if input_color == 'red':
info = '