python 修饰符
在 python 程序中经常看见
1 2 3
| @tf_fun def fun1: balabala
|
可以将修饰符看作是一种函数,这个函数的参数是 被修饰的函数
被修饰函数不带参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| def log(func): def wrapper(): print('log开始 ...') func() print('log结束 ...') return wrapper @log def test(): print('test ..')
test()
log开始 ... test .. log结束 ...
|
说明的确是将被修饰函数套入修饰函数
修改函数属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def log(func): def wrapper(): print('log开始 ...') func() print('log结束 ...') return wrapper @log def test1(): print('test1 ..')
def test2(): print('test2 ..')
print(test1.__name__) print(test2.__name__)
wrapper test2
|
说明使用修饰之后会导致函数名发生改变,可以使用funtools.wraps修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from functools import wraps
def log(func): @wraps(func) def wrapper(): print('log开始 ...') func() print('log结束 ...') return wrapper @log def test1(): print('test1 ..')
def test2(): print('test2 ..')
print(test1.__name__) print(test2.__name__)
test1 test2
|
被修饰函数带参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| from functools import wraps
def log(func): @wraps(func) def wrapper(*args,**kwargs): print('log开始 ...',func.__name__) ret = func(*args,**kwargs) print('log结束 ...') return ret return wrapper @log def test1(s): print('test1 ..', s) return s
@log def test2(s1, s2): print('test2 ..', s1, s2) return s1 + s2
test1('a') test2('a','bc')
log开始 ... test1 test1 .. a log结束 ... log开始 ... test2 test2 .. a bc log结束 ...
|
修饰函数带参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from functools import wraps
def log(arg): def _log(func): @wraps(func) def wrapper(*args,**kwargs): print('log开始 ...',func.__name__, arg) ret = func(*args,**kwargs) print('log结束 ...') return ret return wrapper return _log @log('module1') def test1(s): print('test1 ..', s) return s
@log('module1') def test2(s1, s2): print('test2 ..', s1, s2) return s1 + s2
test1('a') test2('a','bc')
log开始 ... test1 module1 test1 .. a log结束 ... log开始 ... test2 module1 test2 .. a bc log结束 ...
|
[1] https://www.cnblogs.com/gdjlc/p/11182441.html