我们希望在不修改原函数的情况下,来对函数进行扩展。
def begin_end(old): # begin_end 就是 装饰器函数
# 创建一个新函数
def new_function(*args , **kwargs):
print('开始执行~~~~')
result = old(*args , **kwargs)
print('执行结束~~~~')
return result
return new_function
@begin_end # 装饰器begin_end函数 对 add函数 进行扩展
def add(a , b):
'''
求任意两个数的和
'''
r = a + b
return r
r=add(10 , 30)
print('求和:',r)
运行结果:
开始执行~~~
执行结束~~~
求和: 40
像 begin_end()
这种函数我们就称它为 装饰器 。
通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展。
在定义函数时,可以通过 @
装饰器,来使用指定的装饰器,来装饰当前的函数,
可以同时为一个函数指定多个装饰器,这样函数将会安装从内向外的顺序被装饰。
说明:
*args
表示接收所有的 位置参数;
**kwargs
表示接收所有的 键值参数 。
【函数的形参有两数:位置参数 和 键值参数】
def fn3(old):
# 创建一个新函数
def new_function(*args , **kwargs):
print('fn3装饰~开始执行~~~~')
result = old(*args , **kwargs)
print('fn3装饰~执行结束~~~~')
return result
return new_function
@fn3
@begin_end
def add(a , b): # add上有两个装饰器去其进行扩展
'''
求任意两个数的和
'''
r = a + b
return r
r=add(10 , 30)
print('求和:',r)
运行结果:
fn3装饰~开始执行~~~~
开始执行~~~~
执行结束~~~~
fn3装饰~执行结束~~~~
求和: 40