** * Cet article provient d'Udemy "[Introduction à Python3 enseignée par des ingénieurs actifs de la Silicon Valley + application + style de code de style américain Silicon Valley](https://www.udemy.com/course/python-beginner/" Introduction à Python3 enseignée par des ingénieurs actifs de la Silicon Valley + application + Style de code de style de la Silicon Valley américaine ")" C'est une note de classe pour moi après avoir suivi le cours. Il est ouvert au public avec la permission de l'instructeur Jun Sakai. ** **
non_decorator
def add_num(a, b):
return a + b
print('start')
r = add_num(10, 20)
print('end')
print(r)
result
start
end
30
Vous pouvez utiliser "decorator" lorsque vous voulez faire quelque chose de plus avant et après avoir appelé ʻadd_num () `.
decorator
def print_info(func):
def wrapper(*args, **kwargs):
print('start')
result = func(*args, **kwargs)
print('end')
return result
return wrapper
def add_num(a, b):
return a + b
f = print_info(add_num)
r = f(10, 20)
print(r)
result
start
end
30
Pour * args
, voir 52. Arguments de position Tupple
Pour ** kwargs
, voir 53. Dictionary of keyword arguments.
Si vous écrivez comme ci-dessus, il est difficile de comprendre que vous l'utilisez comme décorateur. Par conséquent, en général, lorsque vous utilisez un décorateur, décrivez comme suit.
decorator
def print_info(func):
def wrapper(*args, **kwargs):
print('start')
result = func(*args, **kwargs)
print('end')
return result
return wrapper
@print_info
def add_num(a, b):
return a + b
r = add_num(10, 20)
print(r)
result
start
end
30
En spécifiant une fonction de décorateur en utilisant @
, vous pouvez décorer en utilisant cette fonction.
Écrivez une autre fonction de décorateur et essayez d'utiliser les deux.
two_decorators
def print_more(func):
def wrapper(*args, **kwargs):
print('func: ', func.__name__)
print('args: ', args)
print('kwargs: ', kwargs)
result = func(*args, **kwargs)
print('result: ', result)
return result
return wrapper
def print_info(func):
def wrapper(*args, **kwargs):
print('start')
result = func(*args, **kwargs)
print('end')
return result
return wrapper
@print_info
@print_more
def add_num(a, b):
return a + b
r = add_num(10, 20)
print(r)
result
start
func: add_num
args: (10, 20)
kwargs: {}
result: 30
end
30
Si vous spécifiez un décorateur comme celui-ci,
Vous pouvez voir que print_more
est inclus dans print_info
.
Maintenant, essayez de permuter l'ordre des deux décorateurs.
two_decorators
def print_more(func):
def wrapper(*args, **kwargs):
print('func: ', func.__name__)
print('args: ', args)
print('kwargs: ', kwargs)
result = func(*args, **kwargs)
print('result: ', result)
return result
return wrapper
def print_info(func):
def wrapper(*args, **kwargs):
print('start')
result = func(*args, **kwargs)
print('end')
return result
return wrapper
@print_more
@print_info
def add_num(a, b):
return a + b
r = add_num(10, 20)
print(r)
result
func: add_num
args: (10, 20)
kwargs: {}
start
end
result: 30
30
Cette fois, print_info
est inclus dans print_more
.