Найти - Пользователи
Полная версия: Декораторы
Начало » Python для новичков » Декораторы
1
damilkrose
Вопрос - в чем смысл декораторов. Допустим, я сделал декоратор:
 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)

Эффект будет тот же.
Смысл?
Rodegast
> Но ведь я могу сделать и так:

Декоратор заменяет собой функцию, по этому нужно так:
 f = decorator(f)
И да, это сахар. С ним просто удобнее.
py.user.next
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB