python 修饰符

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()

####### OUTPUT #########
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__)

####### OUTPUT ########
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__)

######## OUTPUT #########
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')

########### OUTPUT #########
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')
######### OUTPUT #########
log开始 ... test1 module1
test1 .. a
log结束 ...
log开始 ... test2 module1
test2 .. a bc
log结束 ...

[1] https://www.cnblogs.com/gdjlc/p/11182441.html


python 修饰符
http://home.ustc.edu.cn/~ustcxwy0271/2022/03/30/python-modifiler/
作者
Xu Weiye
发布于
2022年3月30日
许可协议