函数修饰器大概分为两种:
- 带参数的函数修饰
- 不带参数的函数修饰
1. 带参数的函数修饰
用funA() 函数装饰器,去装饰 funB() 被修饰的函数
def funA(fn):
print('A q前')
fn()
print('A 后')
return 'A return '
@funA
def funB():
print('in BB')
#用函数A修饰函数B,funB等于把函数funB作为参数传递给funA()然后返回给funB
@funA 的等价操作:
funB=funA(funB)
@funA相当于操作funB=funA(funB),此时的funB 相当于一个变量名,或者函数名,取决与funA的ruturn 。
2. 不带参数的函数修饰
使用嵌套函数来实现函数的传入
*args,**kwargs的作用是允许传入任意数量和类型的参数。
def funA(fn):
print('A 前\n')
def fn_in(*args,**kwargs): # 定义一个嵌套函数
print('fn_in 前 \n')
fn(*args,**kwargs)
print('fn_in 后\n')
return '嵌套函数返回'
print('A 后 \n')
return fn_in #必须要有return不然会报错
@funA
def funB1(d1):
print("函数B1:",d1)
funB1('B1参数')
@funA #传入多个参数
def funB2(d1,d2):
print(d1,d2)
funB2("函数B2 第一个参数:","第二个参数")
out=funB1('传入参数')
>>>fn_in 前
>>>函数B1: 传入参数
>>>fn_in 后
>>>out='vv'