Python基础之装饰器
- 1.装饰器
1.装饰器
- 本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下,增加额外功能,装饰器的返回值是一个函数对象
- 标准装饰器:
def wrapper(func):
def inner(*args,**kwargs):
#执行被装饰函数之前的操作
ret=func(*args,**kwargs)
#执行被装饰函数之后的操作
return re
return inner
- 举例
#装饰函数
def out(fn):#fn是形参,但传入的是被装饰的 函数名
def inner():
pritn('是否登录')
fn()# 相当于调用传入的函数
return inner
#标准版
#被装饰函数
def test():
print('查看个人信息')
#使用装饰器
ot=out(test)
ot()#调用装饰器里的inner函数
*语法糖的使用: @装饰器名称
#装饰函数
def out(fn):#fn是形参,但传入的是被装饰的 函数名
def inner():
pritn('是否登录')
fn()# 相当于调用传入的函数
return inner
#使用装饰器
@out
#被装饰函数
def test():
print('查看个人信息')
test()
- 有参数的装饰函数:
- 当被装饰函数有参数时,装饰函数必要有对应参数,通过被装饰函数传入的参数可以在装饰函数与被装饰函数中使用
- 当被装饰函数无参数时,装饰函数的参数可通过被装饰函数传入
def out(fn):
def inner(a,b):
print('内部函数变量',a,b)
fn()
return inner
@out
def test():
pritn('被装饰函数')
test(1,2)
- 被装饰函数有可变参数
- 当被装饰函数没有传参时,装饰函数,没有形参不报错,但传入参数会报错
- 当被装饰函数传入参数,装饰函数有形参,但里面的调用函数没有形参时,被装饰函数的使用参数为空
def out(fn):
def inner():
print('开始执行被装饰函数')
fn()
print('执行完毕')
return inner
def test(*args,**kwargs):
print(args,kwargs)
ot=out(test)
ot()
#开始执行被装饰函数
#() {}
#执行完成
ot('asd',name='fd')# 报错
def out(fn):
def inner(*args,**kwargs):
print('开始执行被装饰函数')
fn()
#fn(*args,**kwargs)
print('执行完毕')
return inner
def test(*args,**kwargs):
print(args,kwargs)
ot=out(test)
ot('脑后','你上次说',name='fds')
#开始执行被装饰函数
#() {}
#执行完成
- 多个装饰器
- 被装饰函数先加载离自己最近的装饰函数
def out1(fn):
def inner():
return '你好漂亮 '+fn()+' 我也很美~'
return inner
def out2(fn):
def inner():
return '神一般 '+fn()+' 花一样'
return inner
#被装饰函数
@out1
@out2
def mtest():
return '被装饰函数'
print(mtest())# 你好漂亮 神一般 被装饰函数 花一样 我也很美~
- 外求者,十年如一日;内求者可一日如十年