2014-03-06 1 views
2

Так что я прочитал это page о декораторах, но я до сих пор не понимаю , когда декораторы полезны.Почему декораторы полезны?

Рассмотрите фрагмент кода, определяющий функцию f, а затем вызывающий его несколько раз. По какой-то причине мы хотим, чтобы f выполнял дополнительную работу. Таким образом, у нас есть 2 способа сделать это:

  1. определяют новую функцию g которая вызывает f, и делает дополнительную работу, необходимую. Затем в главном коде замените все вызовы на f вызовами в g
  2. определяют декоратора g и редактировать код для добавления @g перед вызовом f

В конце концов, они оба достичь того же результата и преимущество 2) более 1) для меня не очевидно. Что мне не хватает?

+5

В тот день, когда вы в них нуждаетесь, это когда вы действительно найдете его полезность. –

+1

Декораторы - это просто синтаксический сахар. В любом месте, где вы хотите обернуть функцию или приложить побочные эффекты к функции, декораторы полезны. –

+1

Здесь вы можете найти много хороших отзывов. Я думаю: http://stackoverflow.com/a/489754/463678 – Jared

ответ

1

Предположим, у вас есть много функций f1, f2, f3, ... и вы хотите, чтобы каждый из них выполнял одинаковые изменения для выполнения одной и той же дополнительной работы.

Вот что вам не хватает, и именно поэтому декораторы полезны. То есть функции, которые принимают функцию и возвращают модифицированную версию.

Декоратор @ синтаксис «просто» для удобства. Она позволяет декорировать функцию, как она определяется:

@decorated 
def foo(): 
    # several lines 

вместо где-то после определения функции:

def foo(): 
    # several lines 

foo = decorated(foo) 

На самом деле, конечно, последний код довольно ужасно, так как это означает, что, глядя при первом определении foo в источнике вы не увидите то же самое foo, которое вызовут пользователи. Таким образом, без синтаксиса, декораторы не были бы столь ценными, потому что вы почти всегда можете использовать разные имена для украшенных и недекорированных функций.

 Смежные вопросы

  • Нет связанных вопросов^_^