Первый декоратор, разбираемся с написанием

Поделиться
HTML-код
  • Опубликовано: 14 мар 2021
  • Попробуем написать декоратор и разобраться что это такое, для чего он нужен.
    Вообще декоратор - это паттерн программирования и используется во многих языках, важное отличие что в Python для них отведено особое место и используется синтаксический сахар @decorator
    Для написания декоратора нужно понимать:
    1) функция полноправный объект, который можно передавать, возвращать, хранить в коллекции и делать все то, что с другими объектами
    2) внутренняя функция может захватывать значения переменных из внешней
    Суть декоратора в том, что мы можем менять поведение декорируемого объекта, при этом не меняя его собственную реализацию, его код.
    Ссылки:
    docs.python.org/3/reference/c...
    docs.python.org/3/glossary.ht...
    Присоединяйся к помощи каналу, будет интересно)
    ✔️Бусти boosty.to/python_russian/donate
    ✔️Юмани 410011506612886
    Будь первым везде и всегда, включай уведомления о новых выпусках 🔔
    #Python #PythonRussian #PyCharm

Комментарии • 69

  • @viktorsokolov8153
    @viktorsokolov8153 Год назад +20

    Уважаемый автор, у вас безусловный преподавательский талант. Это видно по многим видео. В каждом вы не спеша очень доступно разъясняете новичкам тему. И, что важно, морально поддерживаете их. Спасибо за ваш труд и желание поделиться знаниями!
    По теме декораторов. Понимание для меня приходило последовательно. Я познакомился с ними 3 месяца назад. Нельзя сказать, что объяснение (на другом канале) было плохое. Скорее, просто понадобилось определенное время, чтобы переварить это. Наконец-то пищеварение справилось) Спасибо автору канала.

    • @Miron_MipoX
      @Miron_MipoX 10 месяцев назад +1

      полностью согласен. у меня имеется доступ к платным курсам от коробки, там эти информацию упаковали в 9 минут. и в основном автор просто диктует что пишет. а не пытается объяснять свои действия. и нет, они не так уж плохи, но автор Python Russia пишет видео от души так сказать)

  • @user-dd8yw4cl3i
    @user-dd8yw4cl3i 2 года назад +10

    Спасибо огромное за уроки, безумно полезно и доступно!

    • @PythonRussian
      @PythonRussian  2 года назад +2

      благодарю за теплые слова. К сожалению, сейчас совсем нет времени на новые видео, но после нового года постараюсь еще пару полезностей заснять.

  • @user-gc4ic9xc1j
    @user-gc4ic9xc1j Год назад +2

    Вот просто большое спасибо, никакой воды, все понятным языком, как для кирпича все очень даже понял, автору большое спасибо

  • @_Kruzo_
    @_Kruzo_ Год назад +2

    Все доступно и без лишней воды....хотя, в фоне как будто вода льется перед микрофоном :))

  • @Miron_MipoX
    @Miron_MipoX 10 месяцев назад +1

    не жалко писать коменты автору, который делает очень годный контент!

  • @donfedor007
    @donfedor007 Год назад +3

    Спасибо Вам за видео! Очень понятно и интересно!

  • @IlyaIlya_lopkop
    @IlyaIlya_lopkop 3 года назад +5

    Это не видео, а бомба!

    • @PythonRussian
      @PythonRussian  3 года назад +1

      не уверен, что ты искренен=) по-моему немного путано получилось и не понятно

    • @IlyaIlya_lopkop
      @IlyaIlya_lopkop 3 года назад +2

      @@PythonRussian нуу не знаю, я просто декораторы уже проходил, поэтому мне все понятно было. Это надо спросить у тех кто впервые о таком слышит

  • @y18kotov
    @y18kotov Год назад +2

    С 100500 попытки стало понятно. Спасибо!

  • @Yuriy_ko
    @Yuriy_ko 11 месяцев назад +1

    Спасибо за урок! После просмотра, закрепил написанием собственного декоратора и опробовал на разных функциях. Осталось переварить, зачем он нужен(практическое применение), но это дело времени и много практики.

  • @igormatveev8355
    @igormatveev8355 2 месяца назад +3

    большое спасибо за материал, но как же тихо, это жесть

    • @Prodigyqqq
      @Prodigyqqq 25 дней назад

      Весь ютуб лучше смотреть с включенной тонокомпенсацией в Realtek

  • @stevem4806
    @stevem4806 9 месяцев назад +1

    Спасибо!

  • @abra-kadabra5000
    @abra-kadabra5000 10 месяцев назад

    Спасибо! Действительно очень круто объясняете, это талант!

  • @artyomk1476
    @artyomk1476 Год назад

    ТЫ просто ТОП! Спасибо за то что так круто объясняешь!!!!!

  • @kumushabdurahmanova7822
    @kumushabdurahmanova7822 2 года назад +3

    Ждем вторую часть!)

    • @PythonRussian
      @PythonRussian  2 года назад +1

      пока времени не хватает, но сделаю

  • @SoloveY1990
    @SoloveY1990 Год назад

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

  • @nons5761
    @nons5761 8 месяцев назад

    лучшее обьяснение, обожаю твой канал

  • @jackhopckien4566
    @jackhopckien4566 5 месяцев назад

    Спасибо. Подробно и понятно.

  • @ValeriyM_46
    @ValeriyM_46 8 месяцев назад

    отлично объяснил ))) эффект прозрения получил , спасибо)).подпись: горемыка )))

  • @barma1309
    @barma1309 Год назад

    Прекрасно!!!

  • @rpuropu
    @rpuropu 3 года назад +2

    сегодня пойду под твой канал пару общих тетрадок куплю).. ьуду раскрывать темы до конца, со всеми ссылками)

    • @PythonRussian
      @PythonRussian  3 года назад +3

      вот это светлая мысль! не потому что канал, а то что будешь конспектировать и читать по ссылкам и в книжках - это просто круто помогает в развитии. У самого старые конспекты лежат по питону =) Отработали свое и принесли свою пользу.

    • @user-ch3lo3my5j
      @user-ch3lo3my5j 3 года назад +1

      Я это с самого начала делаю👍🏻

  • @andreiart9160
    @andreiart9160 2 года назад

    Контент - пушка_ракета!

  • @CRESHT
    @CRESHT Год назад

    Круто! Кое что дошло, но практика все решает

    • @PythonRussian
      @PythonRussian  Год назад

      да, без практики в нашем деле никуда

  • @spiritgame4266
    @spiritgame4266 2 года назад +2

    Крутая идея - создать декоратор, который заворачивает функцию в thread и запускает его.

    • @PythonRussian
      @PythonRussian  2 года назад +1

      идея хорошая, главное понимать, что там в функции будет происходить и не забывать про GIL

  • @user-rm4yr9xr4r
    @user-rm4yr9xr4r 17 дней назад

    Спасибо ! А почему в выводе значение основной функции (5) идёт после "обертки " декоратора "до" и "после" ?

  • @Laserball74
    @Laserball74 Год назад +1

    Просьба в следующих видео сделать шрифт по крупнее так как Вас смотрят люди и с плохим зрением!

    • @PythonRussian
      @PythonRussian  Год назад +1

      да, я стараюсь, просто если сильно увеличивать то на экране мало входит и приходится скроллить туда сюда.

  • @drarov91
    @drarov91 Год назад

    @Python_Russian, как вы прикрепляете функцию print в конце строки и она автоматически встает в начало?

    • @PythonRussian
      @PythonRussian  Год назад +1

      пичарм так умеет, у меня есть видео по комбинациям клавиш и фишкам.

  • @user-do4nq3fr6t
    @user-do4nq3fr6t 3 года назад +1

    да, на первых порах сложно =) но зато информативно

  • @725etw7w
    @725etw7w 11 месяцев назад

    Здравствуйте, почему мы не можем вызывать враппер с тремя аргументами и третьм передавать func(как объект), и всё будет одно и тоже? Или это так делать не надо?

  • @user-kh5vi4yi5t
    @user-kh5vi4yi5t 6 месяцев назад

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

  • @alw-3052
    @alw-3052 2 года назад

    Спасибо. Не сразу, но разобрался.
    Получается мы первой командой function = logger(summ):
    1. Передаем адрес объекта-функции summ в функцию logger
    2. Создаем объект-функцию function, которая ссылается на внутреннюю функцию wrapper
    И теперь по факту командой function(2, 3) мы вызываем функцию wrapper(2, 3), в которой уже инициализирован объект-функция summ.
    Но возник вопрос. А в чем преимущество декоратора от вот такого с виду более простого решения?
    ##############################
    def logger_new(func, a, b):
    print(f'{func.__name__} started_2')
    result = func(a,b)
    print(f'{func.__name__} finished_2')
    return result
    print(logger_new(summ, 2, 3))
    ##############################

    • @PythonRussian
      @PythonRussian  2 года назад +1

      Первое преимущество - встроенное средство языка, которое грех не использовать, второе и самое главное - придется импортировать и писать твой логгер везде, представь что сумм у нас в 15 модулях используется по коду. А декоратором 1 раз декорировали саму функцию и она везде работает одинаково.

    • @alw-3052
      @alw-3052 2 года назад

      @@PythonRussian да, про дублирование я не додумался. Спасибо!

  • @Miron_MipoX
    @Miron_MipoX 3 месяца назад

    возможно глупый вопрос. но вот стало интересно. Попалась такая задача, где имеется функция, уже задекорированная декоратором №1 и она с параметром. Мне нужно было обернуть декоратор №1 своим декоратором № 2. Я конечно сделал по самому очевидному пути. Перед местом, где функция декорируется декоратором №1 обернул декоратор №1 декоратором №2. Но мне стало интересно, а возможно ли написать такой декоратор №2, который стеком декорирует функцию, которая уже задекорирована декоратором №2 так, что бы можно было перехватить параметры декоратора №1 декоратором №2, что бы например проверить параметр который был передан декоратору№1 и в случае его валидности, просто вернуть обратно декоратору№ 1 или как то в дальнейшем выполнить доп. логику, в случае если данные в параметре были не валидные. Проще говоря применить синтаксический сахар над функцией, на которой весит другой сахар с параметрами и вот эти параметры хочу провалидировать.

    • @Miron_MipoX
      @Miron_MipoX 3 месяца назад

      Жалко что в тг нет чата или хотя бы комментариев к постам)

    • @PythonRussian
      @PythonRussian  3 месяца назад

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

  • @Himera1983
    @Himera1983 2 месяца назад

    А почему оператор return невыходит использовать в If если она не внутри функции?

    • @PythonRussian
      @PythonRussian  2 месяца назад

      ретурн же это возврат, а если не из функции то откуда возврат?

    • @Himera1983
      @Himera1983 2 месяца назад

      @@PythonRussian согласен. Но в книге грокаем алгоритмы ретурн в блоке if и это условие не в блоке функции . И пишут запустите этот код. Так же есть тоже самое но уже в блоке функции.

    • @Himera1983
      @Himera1983 2 месяца назад

      @@PythonRussian книга грокаем алгоритмы в параграфе алгоритм дейкстры

    • @Himera1983
      @Himera1983 2 месяца назад

      @@PythonRussian большое спасибо что ответили .

    • @Himera1983
      @Himera1983 2 месяца назад

      @@PythonRussian согласен . Значит в книге ошибка и эта книга не та с которой можно чему то учиться ?

  • @kan4317
    @kan4317 3 года назад +1

    wrapper должен получать как *args так и **kwargs, иначе аргументы переданные по ключу не передадутся в оборочиваемую функцию, а в классе он должен еще и принимать self

    • @PythonRussian
      @PythonRussian  3 года назад +3

      допустим, а еще параметризованый декоратор можно писать. А тема конкретно этого ролика какая?

    • @kan4317
      @kan4317 3 года назад +2

      @@PythonRussian, Ладно, но про kwards можнг было и тут упомянуть, боюсь многие посыпятся на этом

  • @user-zt9vo4gh3p
    @user-zt9vo4gh3p 3 месяца назад +1

    Без 100 грамм не разберешься.

  • @rpuropu
    @rpuropu 3 года назад

    ВОпрос один мучает, подстать твоему каналу. МНого где слышу, что нагруженные части питоне, люди пишут на С++, и потом их интегрируют в код. Как это выглядит вообще? Это модуль скомпилированный? в питоне потом подключается через импорт или как? Что там за процедура вообще.. может где туториал есть поизучать? я между конспектами и кодингом отдыхаю изучая вот такие впоросы, что бы поинмать к чему меня может притянуть, и какие навыки пригодятся, а какие нет..

    • @PythonRussian
      @PythonRussian  3 года назад

      понятия не имею, никогда не занимался, но в некоторых книгах есть раздел об этом, где показывают способ. По мне так это крайне редкая вещь в реальной работе.

    • @leonidpervak9624
      @leonidpervak9624 2 года назад

      Могу быть не прав, но такое, насколько я понимаю, можно сделать с Cython - cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html

  • @randomcraft2345
    @randomcraft2345 11 месяцев назад +1

    Честно, не очень понимаю идею декораторов через сахар. Без сахара понятно, у тебя есть область видимости, там тебе нужна немного другая сумма, там ты её и задекорировал, при этом вне этой области сумма старая. А вот с сахаром... так теперь сумма везде изменена, почему тогда сразу саму сумму не поменять?

    • @PythonRussian
      @PythonRussian  11 месяцев назад +1

      для 1 функции и 1 правки возможно, а что если тебе нужно поменять 3 разные функции одинаково? ты полезешь в код всем 3 или сделаешь 1 декоратор?

    • @randomcraft2345
      @randomcraft2345 11 месяцев назад

      @@PythonRussian спасибо, теперь стало намного яснее!
      И ещё большее спасибо за оперативный комментарий!

  • @kan4317
    @kan4317 3 года назад +2

    Можешь громче делать ролики? Бесит дико

    • @PythonRussian
      @PythonRussian  3 года назад +1

      наверное как то могу, посмотрим

  • @dedovchemodanchik
    @dedovchemodanchik 8 месяцев назад

    Очень мелко. Не видно