Декораторы в Python Часть 1. Decorator Python
🔥🔥🔥 Инди-курс по Python 🔥🔥🔥
stepik.org/course/63085/promo
👉👉👉 Свой вопрос по курсу можешь задать в чате
t.me/+SlnNhAO7caBlNDM6
👉👉👉 Также подписывайся на мой телеграмм-канал
t.me/python_egoroff
Подробнее об урок
egoroffartem.pythonanywhere.co...
Замыкания в Python. Closure Python
• Замыкания в Python. Cl...
Замыкания в Python.Часть 2
• Замыкания в Python Час...
*args и **kwargs Python. Передача аргументов в функцию
• 40 *args и **kwargs Py...
stepik.org/course/63085/promo
Курс на степике
В данном уроке мы вспомним о замыканиях и на их основе научимся создавать декораторы.
Декоратор - это функция, которая в качестве аргумента принимает другую функцию и возвращает функцию-замыкание. Декораторы нужны для расширения функционала переданной функции за счет обертки в замыкании
Все видео этого курса можете найти на сайте
egoroffartem.pythonanywhere.co...
или в Вк
videos-177962775?secti...
Если кому нужна помощь, предлагаю индивидуальные занятия. Подробнее пишите в личку в вк
artem_egoroff
python.study
В данном группе можете найти информацию о новых видео и задать вопросы
Пікірлер: 163
🫵 Теория без практики - ничто, поэтому 👇 🐍 stepik.org/course/63085/promo 👉 специально для тебя создал бесплатный топовый курс по Python 👉 В нем тебя ждет: 📗 более 400 практических заданий на программирование 📗 более 250 тестовых заданий на проверку материала 📗 десятки часов видеоматерилов по теории 📗 видеоразборы решения заданий 📗 текстовые материалы по урокам, примеры кода 📗 доступ к закрытому чату с дружественной обстановкой 📗 сертификат в случае успешного прохождения курса
Спасибо огромное - хоть начал разбираться, что такое декораторы, а то вначале казалось лес непроходимый.
Очень доступно и понятно. Было несколько заходов разобраться в этой теме, благодаря тебе стало яснее. Огромное спасибо!)
@1nparad1sepwnz79
Жыл бұрын
Полностью согласен) я только с 4 захода разобрался что такое декараторы, просматривая 4 видео по 4 раза начиная со вложенных функций)
Начало ролика - суперпонятное, спасибо. За первые 3 минуты 25 секунд - респект.
Выглядит так, как будто один топовый кодер написал мегакачественный код и уволился, набрали кодеров попроще, которые боялись править этот прекрасный код и просто начали лепить вокруг него костыли и назвали эту штуку - декоратор )))
@vladislavbulanov625
2 жыл бұрын
объяснение лучше того что в видео
@1nparad1sepwnz79
Жыл бұрын
хахахаахахахахахаха
@xumpocmb-404
11 ай бұрын
абсолютно поддерживаю. если выкинуть из кода все эти дурацкие замыкания и обертывания - код работает так же, его меньше, читабельнее. сколько ни пытаюсь понять ЗАЧЕМ декораторы - нигде не могу найти ответ. везде пишут как они работают, но НИКТО не написал - зачем они.
@user-ib9uw3he1y
10 ай бұрын
@@xumpocmb-404 не знаю, будет ли актуально, но попробую объяснить В реальной разработке может быть тысячи строк кода, сотни функций и куча модулей и директорий. Допустим, логика вашего проекта построена так, что в одном из модулей вам понадобилось использовать функцию, которую вы уже написали, но с каким-то добавочным функционалом. (Допустим, вам нужно добавить какое-то простенькое вычисление или вывести что-нибудь на экран) И вот вместо того, чтобы копировать функцию из прошлого модуля, вставлять её в новый модуль, изменять её название и добавлять этот функционал, проще написать декоратор :) Вы просто импортируете старую функцию, вешаете на неё декоратор и вуаля, готово. Можно использовать получившуюся функцию почти с тем же функционалом, не тронув старую и ничего не поломав в уже написанном коде
@Nina-hy4ql
5 ай бұрын
@@xumpocmb-404 Говорят же, для расширения функционала функции. Когда вам не нужно менять декорируемую функцию полностью, но в конкретном месте нужно несколько изменить ее поведение.
Нужная вещь. Спасибо, что рассказали
Спасибо, это очень качественное объяснение! Учу python по книге, но рекурсивные функции, замыкания и декораторы там были описаны таким сложным языком. Пришлось искать материал по этим темам в интернете. Так я нашёл ваш плейлист по python, и это реально крутой плейлист!)
Это было божественное объяснение. Структурированно, не слишком быстро, советы про *args и *kwargs. Благодарю.
@crazyvalyochek516
Жыл бұрын
**
@user-xl6gp9em1b
9 ай бұрын
Не переигрывай пельмень
Прекрасно все объяснил! Большое спасибо))))))
Очень понятное и доступное объяснение. Благодарю Артем!
Большое спасибо, Артем.
bye: Дорогой дневник, мне не подобрать слов, чтобы описать боль и унижение, которое я испытал. 😁
@user-tx3mt1zi2d
Ай бұрын
ты как прям школьники в американском фильме
Я декораторы начал изучать после того, как захотел написать телеграм-бот, и тут Остапа понесло... >>> Что такое декораторы >>> что такое замыкание >>> что такое вложенные функции....что такое глобальные, локальные и иже с ними переменные.... Как будто квесты в игре проходишь, берешь один квест, по дороге еще 10 штук набираешь))) Зато тренируешься, вспоминаешь основы, закрепляешь их и т.д.
@aace6333
2 ай бұрын
+++ где-то год назад уже смотрел весь этот курс, пришлось напоминать себе что такое замыкание
Твои объяснения для меня пока что лучшие, я их понимаю (может и не с первого раза), но со второго точно)))
Очень доступно. Спасибо
О, какая крутая штука ! Спасибо большое за доступное объяснение!
Ты вообще красава! Все понятно и информативно) Продолжай в том же духе и не забрасывай канал))
наконец то, хоть кто-то доступно на пальцах объяснил 👍
Все понятно и доходчиво. Спасибо.
жирный лайк, спасибо большое Вам.
Спасибо за видео!
Найбільш зрозумілий урок з тих що я подивився, дякую.
Очень круто и информативно) Подача информации просто невероятна)
Круууто!
Спасибо за доступ ко всем материалам, после окончания курса по питону, буду брать ООП
Артем, спасибо большое!
наконец все стало понятно
Купи мир.... Такой интересный призыв)))
а так спасибо все равно))) понимаю что вас нужно поддерживать!
Спасибо!
твоё видео помогло мне, другие не помогали. Я так и не вынимал суть декораторов до твоего видео. Спасибо большое! Продолжай в том же духе! :) Подписался и разослал друзьям.
до этого видео я не понял что такое дикораторы, спасибо вам большое 🙂
Спасибо, тебе, дружище!!)
Офигенно. Реально каждое действие объясняете и всё максимально понятно) Подписка
@user-fw7dn9ib1j
3 жыл бұрын
Что? Каждое действие ?Сам себя похвалил и наоайкал. "Чтобы понимать декораторы нужно знать замыкание, вот эта функция будет замыканием..." ништяк обьяснюха...продолжу а вот это декоратор не хуже обьяснил правда?
@kadencode5347
2 жыл бұрын
@@user-fw7dn9ib1j чел, надо было курс смотреть этот... он об замыканиях говорил...
Тёма, ты лучший
Обязательно оформлю подписку на тебя. У меня по питону только ты и Олег Молчанов в приоритетах
@RomanZverev-yc5qc
3 жыл бұрын
@Askhat Moldakasym тоже очень годный канал)
@schmoopiegrob8758
2 жыл бұрын
как успехи спустя год?
@velomatica
2 жыл бұрын
@@schmoopiegrob8758 blog на flask второй после молчанова
Я кажется понел, благодарю!
весь ролик очень понятный
Супер подача! По качеству нахожу сходство c Ильёй Кантором, я у него Git изучал по роликам
спасибо за видео
наконец то я всё понял
Спасибо
Как всегда все офигенно)
*ТоП* !
Что-то тяжко даётся эта тема. Надеюсь на практике станет понятнее.
Спасибо Вам за уроки
Огромнейшее спасибо, самое доходчивое обьяснение декораторов
@ozen950
2 жыл бұрын
Точно! Если, конечно, других не слышал.
О наконец классный контент поддерживаю автора
Super. Spasibo ogromnoe!
Спасибо за урок. PS. Купить Мир.
Почему нельзя сказать что декоратор выставляет перед функцией в него входящей как раз таки декоративное сообщение или элемент, и так же может сделать после результата функции в нём? Понапишут своих высокоинтеллектуальных текстов, а потом переводи на человеческий по пол часа.
топчик
А твой преподаватель был не случайно Тимофей Хирьянов?😏
@ruman3726
3 жыл бұрын
нет
Хороший комментарий для Артёма
Спасибо) Очень просто объяснил
Из всех лекций Артёма, эту я так и не понял, от слова "совсем". Постоянные перескоки с одной функции на другую, и для чего это нужно в коде, так и осталось большой загадкой!
Одно из лучших объяснений , по книгам и по лекциям не очень понятно
Я до сих пор не понимаю больше половины материала, но понял, хоть что-то, когда поигрался с кодом тут: www.pythontutor.com/visualize.html#mode=edit Ещё вот таким кодом: def decorator(func): def inner(string): print('sub 1') func() print('sub 3') def catch(): string() return catch return inner def say(): print('sub 2') decorator(say)(say)()
@RomanZverev-yc5qc
3 жыл бұрын
Где вы взяли такой интересный пример?)
Добрый день У меня давно был вопрос По какой формуле можно посчитать интеграл и интегральные числа в python?
@kandreyk9159
4 жыл бұрын
from sympy import * var('x') integrate(sin(x), x)
@vladimirkuchin1677
Жыл бұрын
Пакеты математические, например, SciPy, SymPy поддерживают такие вычисления. Плюс есть численные методы, позволяющие вычислять интегралы (метод Симпсона, 3/8, трапеций и т.д.)
Поясните пожалуйста (ролик 3:02): Когда объявляем, что say будет вызывать функцию декоратора, мы же просто объявляем переменную say, а не пере объявляем функцию, какой смысл в этом?
@poliklopik6774
2 жыл бұрын
Не знаю, актуален ли еще вопрос, но на всякий постараюсь пояснить. Все в питоне является объектами, которым можно присвоить имя. Так любая функция является объектом с именем (то, что идет после def). В 16 строке его кода мы просто говорим, что теперь в переменной say будет лежать не старая функция, которая просто пишет привет мир, а там лежит результат работы decorator, то бишь ссылка на функцию inner, которая использует в своем функционале «старую» функцию say.
Т.е. оригинальную функцию без обертки уже не вызвать в данном случае?
Что делать, если превышена глубина вложенности? Речь идет о фрагменте кода на 4:05, подскажите кто столкнулся тоже
Привет. Мне нужно разработать декоратор to_lower, который будет переводить все строковые аргументы (как именованные, так и не именованные) декорируемой функции в нижний регистр. Мой код def to_lower(func): def to_lower(func): def wrapper(*args, **kwargs): func(*args, **kwargs) return func(*args, **kwargs).lower() return wrapper При это Выводиться ошибка 'NoneType' object has no attribute 'lower'. В чем ошибка. Еще просьба сообщить если видео по генераторам. Заранее спасибо.
👍
Я вообще все что запомнил что у него есть платный канал
Артем, Вы прекрасно все объяснили...но я ни хера не понял даже с третьего раза :(
Купить мир.Панимаю
Блин, две недели, две недели бился т только щас въехал 😂 Спасибо за уроки!
Привет Какие модули надо знать для создания нормальной программ в питон
@user-gh1nb7dv2g
4 жыл бұрын
Смотря какой тип программы? Web приложения, desktop & mobile приложения, скрапперы, игры, Искусственный интелект?
@rahmatj0n
4 жыл бұрын
@@user-gh1nb7dv2g например decktop
@rahmatj0n
4 жыл бұрын
Для всех этих задач есть отдельные модули ?
@user-gh1nb7dv2g
4 жыл бұрын
@@rahmatj0n Конечно, одним модулем ты все не сделаешь, тем более с модулем. Научись Фреймворкам. Для Desktop & Mobile приложений у Python есть фреймворк Kivy, для сайтов Django & Flask, для скрепперов Scrapy. И чтобы эффективно работать со всем этим тебе нужно знать разные модули.
@rahmatj0n
4 жыл бұрын
@@user-gh1nb7dv2g С чего начать
жаль в кризис не могу стать патрионом, не посмотреть многих видео
Только благодаря этоому видео я понял что такое декораторы. Спасибо!
Чтобы понять то, что здесь рассказываю, посмотри предыдущий материал, но он платный. Прикольно)) Автор конечно сам решает, как монетизировать контент, но как то смысла нет тогда здесь что-то искать полезное, когда ту же информацию можно получить на соседнем канале бесплатно. Понятно, что по ютубу не выучишь питон, информация не систематезирована, так еще и неотделимая часть только для спонсоров. Тогда имеет смысл весь контент только по подписке. Подумал тут еще, что стоимость живого подписчика (не бота) в схожей тематике на 2021г, если привлекать его через рекламу (например адвордс), может колебаться до 150-250 р. Не хотелось бы, чтобы кнопка "Спонсировать" и жадность авторов, убили бы тему доступного образования на Ютуб. Возможности для заработка у канала то никто не отнимал - вон и ссылки на продвижение платных продуктов в описании. Такой способ монетизации больше похож на манипуляцию) В итоге, потратил время, вопрос остался не закрыт. Вопрос: зачем мне такой канал в подписках? Да вроде не зачем. Развернутый коммент для продвижения видео - в подарок;) Отписка.
Как купить спонсорство ,номер карты не идёт,всё ввёл номер карты не идёт а ввёл всё правильно ?????
@egoroffchannel
4 жыл бұрын
Это не ко мне вопросы. Либо с картой проблемы, либо с ютубом или патреоном
@user-np6pe4uh1t
4 жыл бұрын
@@egoroffchannel у меня есть приложение которое требует обновлений модулей внутри неё, приложение прислали, и обычный Пип инсталл не работает, также модули я скачиваю через pip instal trusted host....... Потому что проблема с ссл сертификатом, так как обновить модули внутри приложения?
прям множественное наследование с полиморфизмом какоето)
Добрый день! Не могу понять, как аргумент функции func попадает в n в функции inner? По моей логике это нужно сделать так: def decor(func, arg): def inner (): func(arg) ...
@user-wk9dl9lu2t
2 жыл бұрын
указывай тайм код, а то многое меняется в видео.
@user-wk9dl9lu2t
2 жыл бұрын
Сначала say становится inner, а затем уже вызывается якобы inner и уже в него передается аргумент n. Если не поймешь, попробую переобъяснить, раньше у самого проблемы с этим были) Главное посидеть, вникнуть, не торопится.
@capitulation27
Жыл бұрын
@@user-wk9dl9lu2t Декораторы хорошо понимаете?)
@user-wk9dl9lu2t
Жыл бұрын
@@capitulation27 из видео этого понял.
@capitulation27
Жыл бұрын
@@user-wk9dl9lu2t А что-то параллельно читаете?
Как эта собака работает? Почему именно в том месте?
Блин, Артем, как же это бесит. В твоем курсе по Python на Stepik не показывается этот долбанный неправильный тест, поэтому из-за этого одно задание можно решать неделю т.к я не могу понять, почему Failed test #4 of 16. Хоть я подставляю все возможные значения и программа работает, но ответ не засчитывается. КАК ЖЕ ЭТО РАЗДРАЖАЕТ(((
@egoroffchannel
4 жыл бұрын
курс еще в этапе разработки какое задание? и какое у тебя решение?
Обьяснитн максимально просто что значит вернуть вложенную функцию без вызова пожалуйста
@egoroffchannel
3 жыл бұрын
kzread.info/dash/bejne/hqNms5mbgtjIeNo.html вот здесь говорится, что такое ВЫЗОВ объекта
"buy world" - амбициозно...
"Hello world" and " Buy world" 🤣🤣🤣In my opinion, it should have been "Bye world, not Buy"
@AXGroser
Жыл бұрын
Мы купим весь мир)
А когда этотнужно на практике?
@serbon3905
Жыл бұрын
В ооп много встроеных декораторов используются, @property @classmethod @staticmethod и подобное
Как смотрю, так фольксваген напоминает: Садишься такой в машину норм комплектации, за последние бабки, а там куча зуглушек :). Типо чо не мог побогаче комплектацию купить, нищеброд. И не надо вот, что бесплатно... время тоже стоит. дороже ничего нет. Но автору респект. Понятно.
Привет мир, я хочу тебя купить... ))) --buy--
10:14 скрытый байт
Непонятно зачем нужна функция inner. Я ее убрал из кода и все работает точно также
привет мир, купить мир
Вообще ничего непонятно, что откуда берётся, почему в функцию пишем не заданные перменные. Я вообще в шоке, что код этот запускается, это видимо магия какая-то программирования. Тут переменная ля функций задаётся лишь в самом конце, крч бред, я пока не понимаю.
Подскажите, пожалуйста, в чем может быть проблема? В последней строчке выводится результат, но в конце еще выводится None: def header(func): def inner(*args, **kwargs): print('') func(*args, **kwargs) print('/') return inner def table(func): def inner(*args, **kwargs): print('') func(*args, **kwargs) print('/table') return inner @header def f(x,y): print(x, y) print(f(10, 5)) # #10 5 #/ #None
@egoroffchannel
3 жыл бұрын
в питоне что возвращает функция, когда не указан return?
@reqam7969
2 жыл бұрын
@@egoroffchannel true or false?
@gorin1337
Жыл бұрын
@@reqam7969 None
Объясняет как боженька, но стал жадничать в последнее время) Хотя, согласен, что любой труд должен оплачиваться.
@azar4ik1
4 жыл бұрын
Либо пусть полностью платный, либо нет. Неполная информация не имеет смысла. (как трейлер перед выходом фильма)
@forez7745
3 жыл бұрын
@@azar4ik1 но благодаря трейлерам, мы можем захотеть пойти на фильм. Да и в целом понять что он из себя представляет
Купи мир
Замыкание это не передача функции в функцию....это больше о замыкании ссылок на значение в памяти......исходя из этого обьяснение уже фундаментально не верно
Ничего не понял.. Какой-то неудачный пример... Лучше на чем-нибудь полезном показывать, где это можно применить.
А
как-то слишком все запутано и непонятно
Здрасьте: "Этот контент нельзя приобрести."
@egoroffchannel
4 жыл бұрын
значит вы не житель РФ на патреоне можно оформить спонсорскую подписку
@DoktorZlo96
4 жыл бұрын
@@egoroffchannel не, патреон меня не интересует. жаль
@user-pb7dc1cw9g
4 жыл бұрын
@@DoktorZlo96 vpn? Proxy?
How the fuck did I come here?
Кто-то мне объяснит зачем декораторы нужны? Чтобы функция выводила дополнительную строку? ДОПИШИ В ФУНКЦИЮ МЛИН!! Унаследовать из другого участка кода? ИСПОЛЬЗУЙ НАСЛЕДОВАНИЕ и не порти код своего коллеги кодом, который теперь будет вызываться с его функцией всегда и о котором он ничего не знал! Такое впечатление что программисты просто любят себе проблемы создавать!
Больно сложно пишешь, чем на самом деле. Для разнообразия хоть имена функциям давать разные
@Das.Kleine.Krokodil
2 жыл бұрын
где одинаковые они?
Ну почему все "учителя" объясняют все исключительно через пень колоду? Декоратор decor это функция, которая берет в качестве аргумента функцию foo. После чего запись foo(без вызова) аналогично decor(foo) ВСЕ!!! Больше ничего мудрить не надо. def decor(Func): return Func.__doc__ + " decor run" @decor def foo(): """My documents container""" pass result = foo #Не запускаем! Без @decor эта строчка будет result = decor(foo) #result получит не ссылку на foo а то что вернет decor print(result) # А если мы хотим чтоб foo еще и запускалась, то надо чтоб # decor возвращал функцию, причем не обязательно foo или то что в нее вложено # да и вообще decor не обязанна иметь return, в этом случае вернет None def decor(Func): print("decor run") return Func @decor def foo(): #здесь могут быть переменные print("foo run") foo() #Теперь можно запускать, без запуска сработает только decor #Но есть еще и запускаемые декораторы. Этот декоратор обязан вернуть ссылку на функцию, которая берет декорируемую функцию в качестве аргумента. def decor(Func): print("decor run") return Func def callable_decor(): print("callable run") return decor @callable_decor() #здесь могут быть переменные def foo(): print("foo run") foo()
@Das.Kleine.Krokodil
2 жыл бұрын
ты думаешь лучше объяснил? вот читает новичок твой коммент: _"это функция, которая берет в качестве аргумента функцию foo. После чего запись foo(без вызова) аналогично decor(foo)"_ сразу вопросы - что за foo такой? что такое "foo(без вызова)"? итд так что в своем глазу соломинку не видим
@user-gf6er4ug6g
2 жыл бұрын
@@Das.Kleine.Krokodil А для кого я кусок кода вставил? Ты чо не видишь кнопку "читать дальше"? Автор же нафигачил каких то заумностей, каких то сложных функций в функции, да еще и язык HTML зачем то сюда вогнал. А что касается "новичка"(не того которым Навального отравили) Так новичок, прежде чем изучать функции с декораторами, должен знать что такое просто функция, и что ее можно запускать.
@Das.Kleine.Krokodil
2 жыл бұрын
@@user-gf6er4ug6g у тебя плохой пример, потому что он ничего не делает и нет аргументов функций
@user-gf6er4ug6g
2 жыл бұрын
@@Das.Kleine.Krokodil Может и плохой, и не идеальный, но тут хотя бы передана основная идея декораторов, что строчка @decor перед def foo можно заменить строчкой foo = decor(foo) после ввода этих функций Это главное, то что автор так и не передал, а уж брать агрументы - это вообще частный случай. А то что здесь автор наворочал - мне ни фига не помогло разобраться. Пришлось методом научного тыка.
@user-gf6er4ug6g
2 жыл бұрын
@@Das.Kleine.Krokodil Я для кого писал строчку с комментарием "здесь могут быть переменные"? Прочитай сначала потом пиши.
Похоже, Вы абсолютно не понимате, что такое "замыкание", если называете декоратор "замыканием".