Форум сайта python.su
Вопрос - в чем смысл декораторов. Допустим, я сделал декоратор:
def decorator(func): def wrapper(): print("Decorated func:") func() return wrapper def f(): print("Imma func") @decorator f()
def decorator(func): def wrapper(): print("Decorated func:") func() return wrapper def f(): print("Imma func") decorator(f)
Офлайн
> Но ведь я могу сделать и так:
Декоратор заменяет собой функцию, по этому нужно так:
f = decorator(f)
Онлайн
damilkroseСмысл в том, что если у тебя есть много вызовов функции f() по всему коду, то тебе не надо в каждом вызове что-то менять. И декораторов может быть много, при этом сама функция ни разу не затрагивается.
Эффект будет тот же.
Смысл?
>>> def f(a, b): ... return a + b ... >>> print(f(1, 2)) 3 >>> print(f(3, 4)) 7 >>> print(f(1, 2) + f(3, 4)) 10 >>>
>>> def dec_add1(fun): ... def wrap(a, b): ... print('See', a, b, 'for add 1') ... return fun(a + 1, b + 1) ... return wrap ... >>> @dec_add1 ... def f(a, b): ... return a + b ... >>> print(f(1, 2)) See 1 2 for add 1 5 >>> print(f(3, 4)) See 3 4 for add 1 9 >>> print(f(1, 2) + f(3, 4)) See 1 2 for add 1 See 3 4 for add 1 14 >>>
>>> def dec_add1(fun): ... def wrap(a, b): ... print('See', a, b, 'for add 1') ... return fun(a + 1, b + 1) ... return wrap ... >>> def dec_mul2(fun): ... def wrap(a, b): ... print('See', a, b, 'for multiply 2') ... return fun(a * 2, b * 2) ... return wrap ... >>> @dec_add1 ... @dec_mul2 ... def f(a, b): ... return a + b ... >>> print(f(1, 2)) See 1 2 for add 1 See 2 3 for multiply 2 10 >>> print(f(3, 4)) See 3 4 for add 1 See 4 5 for multiply 2 18 >>> print(f(1, 2) + f(3, 4)) See 1 2 for add 1 See 2 3 for multiply 2 See 3 4 for add 1 See 4 5 for multiply 2 28 >>>
>>> def dec_add1(fun): ... def wrap(a, b): ... print('See', a, b, 'for add 1') ... return fun(a + 1, b + 1) ... return wrap ... >>> @dec_add1 ... @dec_add1 ... def f(a, b): ... return a + b ... >>> print(f(1, 2)) See 1 2 for add 1 See 2 3 for add 1 7 >>> print(f(3, 4)) See 3 4 for add 1 See 4 5 for add 1 11 >>> print(f(1, 2) + f(3, 4)) See 1 2 for add 1 See 2 3 for add 1 See 3 4 for add 1 See 4 5 for add 1 18 >>>
Отредактировано py.user.next (Ноя. 17, 2017 03:02:02)
Офлайн