Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 16, 2017 13:28:40

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

Декораторы

Вопрос - в чем смысл декораторов. Допустим, я сделал декоратор:

 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)

Эффект будет тот же.
Смысл?

Офлайн

#2 Ноя. 16, 2017 13:38:23

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2680
Репутация: +  182  -
Профиль   Отправить e-mail  

Декораторы

> Но ведь я могу сделать и так:

Декоратор заменяет собой функцию, по этому нужно так:

 f = decorator(f)
И да, это сахар. С ним просто удобнее.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#3 Ноя. 17, 2017 02:59:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Декораторы

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


tags: decorator



Отредактировано py.user.next (Ноя. 17, 2017 03:02:02)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version