Devvver
@Devvver
seo специалист

Реально ли работать на питоне не понимая сути декораторов?

В общем пытаюсь учить питон и не могу никак понять суть декораторов. Даже не понимаю где их можно использовать, я сколько писал на object pascal и не разу с ничем подобным не сталкивался, хотя и использовал ООП.
Вопрос - реально ли вообще писать на python не используя декораторы? Первоначально мне показалось что да, но потом увидел сообщения что в Джанге и Фласке все на них построено. Это правда?
  • Вопрос задан
  • 325 просмотров
Пригласить эксперта
Ответы на вопрос 4
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
В общем пытаюсь учить питон и не могу никак понять суть декораторов.

Всё зависит от того, насколько давно вы уже пытаетесь их понять и всё никак.
Если покумекав пару минут уже отчаялись, то наверно программирование - не ваша стезя.
Если прочитав пару статей не смогли разобраться, то, может быть, следует сделать еще одну попытку. Или вы считаете, что это прям рокет сайнс и раз уж с первого подхода не осилили, то это уж на всю жизнь теперь "работать без декораторов". Судьба.

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

И нет, на декораторах свет клином не сошелся. Нужно понимать что в питоне функция - это объект первого рода и что это значит.
Нужно понимать, что такое "замыкание" в контексте функционального программирования.
Более того, нужно понимать что такое дескрипторы, как работают мета-классы и много-много всего такого.

Нет, с этими знаниями не рождаются, их нужно осваивать.

Декораторы - это очень простая концепция.
Декоратор - это функция, которая принимает в качестве единственного аргумента какую-то функцию. Декоратор что-то делает с этой функцией (где-то регистрирует ее, документирует, оборачивает её вызов в другую функию) и возвращает её изменённую или другую функцию-обёртку.

Что конкретно вам не понятно?

Надо заметить, что Декоратор как паттерн проектирования имеет боле еширокий смысл. Декорировать можно объекты, классы, функции, даже модули (постольку, поскольку это тоже объекты). Учиться вам надо, сударь, и не ожидать, что всё прошьётся в мозг мгновенно. Быть программистом - это всегда учиться. Не останавливаясь.

Примеров декораторов огромное множество: самые простые и понятные - это:
- замер времени выполнения функции
- кэширование результата
- подстановка части аргументов (partial)
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
@bacon
А что значит понимание сути? Можно понимать, что делает конкретный декоратор, но не понимать как устроена его работа, т.е для вас он "черный ящик". Или вы даже не понимаете смысл таких конструкций?
@login_required
def my_view(request):
    ....

ЗЫ использовать придется, особенно в flask, но можно не создавать самому.
Ответ написан
ermek6
@ermek6
::Живу с удовольствием::
Не набиваюсь в знатоки Python, просто скажу как я понял их:
Допустим, у нас есть некоторая функция, которая отправляет файл по почте

def send_mail(text):
    pass


И вдруг, нам захотелось, что бы отправка логировалась как то по особому, причем функцию логирования мы хотим подключить и к другим нашим функциям, которых так много, что везде писать одно и то же не с руки (т.е. не только при отправке писем, но и при сохранении на диск непример). Для этого мы пишем функцию, куда декоратор @ автоматически подставит нашу функцию. Возвращать же наша функция тоже должна функцию.

def my_loger(func):    # Объявляем декоратор
    def new_func(*args, **kwarts): # Объявляем функцию, которая заменит исходную
        print("Begin send")   # делаем что то важное
        func(*args, **kwargs)    # Вызываем исходную функцию
        print("End send")    # Опять делаем что то важное
    return new_func   # Возвращаем новую функцию


Теперь, при объявлении функций мы можем перед ней написать @my_loger, и логирование будет подключено автоматически.

т.е., написав следующее

@my_loger
def send_mail(test):
    pass


фактически мы получим код

def send_mail(text)
    print("Begin send")
    # Some actions
    print("End send")
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы