# coding=utf-8
def decorator_maker():
    print "001_Start_Я создаю декораторы! Я буду вызван только раз: " + \
          "когда ты попросишь меня создать тебе декоратор."

    def my_decorator(func):
        print "002_Start_Я - декоратор! Я буду вызван только раз: В МОМЕНТ ДЕКОРИРОВАНИЯ функции."

        def wrapped():
            print ("003_Я - обёртка вокруг декорируемой функции. "
                   "Я буду вызвана каждый раз когда ты вызываешь декорируемую функцию. "
                   "Я возвращаю результат работы декорируемой функции.")
            return func()

        print "002_End_Я возвращаю обёрнутую функцию."

        return wrapped

    print "001_End_Я возвращаю декоратор."
    return my_decorator


# Давайте теперь создадим декоратор. Это всего лишь ещё один вызов функции
new_decorator = decorator_maker() # типа создал и вернул переменной декоратор
# выведет:
# Я создаю декораторы! Я буду вызван только раз: когда ты попросишь меня создать тебе декоратор.
# Я возвращаю декоратор.

# Теперь декорируем функцию
print ""

def decorated_function():
    print "004_Я - декорируемая функция."


decorated_function = new_decorator(decorated_function) # декоратор декорировал и вернул
                                                    # уже декорированную функцию в переменную
# выведет:
# Я - декоратор! Я буду вызван только раз: в момент декорирования функции.
# Я возвращаю обёрнутую функцию.

# Теперь наконец вызовем функцию:
decorated_function()
decorated_function()
# выведет:
# Я - обёртка вокруг декорируемой функции. Я буду вызвана каждый раз когда ты вызываешь декорируемую функцию.
# Я возвращаю результат работы декорируемой функции.
# Я - декорируемая функция.