Декораторы в Python Часть 1. Decorator Python
ฝัง
- เผยแพร่เมื่อ 28 เม.ย. 2020
- 🔥🔥🔥 Инди-курс по 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
В данном группе можете найти информацию о новых видео и задать вопросы
🫵 Теория без практики - ничто, поэтому 👇
🐍 stepik.org/course/63085/promo
👉 специально для тебя создал бесплатный топовый курс по Python
👉 В нем тебя ждет:
📗 более 400 практических заданий на программирование
📗 более 250 тестовых заданий на проверку материала
📗 десятки часов видеоматерилов по теории
📗 видеоразборы решения заданий
📗 текстовые материалы по урокам, примеры кода
📗 доступ к закрытому чату с дружественной обстановкой
📗 сертификат в случае успешного прохождения курса
Очень понятное и доступное объяснение. Благодарю Артем!
Выглядит так, как будто один топовый кодер написал мегакачественный код и уволился, набрали кодеров попроще, которые боялись править этот прекрасный код и просто начали лепить вокруг него костыли и назвали эту штуку - декоратор )))
объяснение лучше того что в видео
хахахаахахахахахаха
абсолютно поддерживаю. если выкинуть из кода все эти дурацкие замыкания и обертывания - код работает так же, его меньше, читабельнее.
сколько ни пытаюсь понять ЗАЧЕМ декораторы - нигде не могу найти ответ. везде пишут как они работают, но НИКТО не написал - зачем они.
@@user-kg9du4ii9w не знаю, будет ли актуально, но попробую объяснить
В реальной разработке может быть тысячи строк кода, сотни функций и куча модулей и директорий.
Допустим, логика вашего проекта построена так, что в одном из модулей вам понадобилось использовать функцию, которую вы уже написали, но с каким-то добавочным функционалом. (Допустим, вам нужно добавить какое-то простенькое вычисление или вывести что-нибудь на экран)
И вот вместо того, чтобы копировать функцию из прошлого модуля, вставлять её в новый модуль, изменять её название и добавлять этот функционал, проще написать декоратор :)
Вы просто импортируете старую функцию, вешаете на неё декоратор и вуаля, готово. Можно использовать получившуюся функцию почти с тем же функционалом, не тронув старую и ничего не поломав в уже написанном коде
@@user-kg9du4ii9w Говорят же, для расширения функционала функции. Когда вам не нужно менять декорируемую функцию полностью, но в конкретном месте нужно несколько изменить ее поведение.
Найбільш зрозумілий урок з тих що я подивився, дякую.
Спасибо огромное - хоть начал разбираться, что такое декораторы, а то вначале казалось лес непроходимый.
bye: Дорогой дневник, мне не подобрать слов, чтобы описать боль и унижение, которое я испытал. 😁
Очень доступно и понятно. Было несколько заходов разобраться в этой теме, благодаря тебе стало яснее. Огромное спасибо!)
Полностью согласен) я только с 4 захода разобрался что такое декараторы, просматривая 4 видео по 4 раза начиная со вложенных функций)
Начало ролика - суперпонятное, спасибо. За первые 3 минуты 25 секунд - респект.
Нужная вещь. Спасибо, что рассказали
Спасибо, это очень качественное объяснение! Учу python по книге, но рекурсивные функции, замыкания и декораторы там были описаны таким сложным языком. Пришлось искать материал по этим темам в интернете. Так я нашёл ваш плейлист по python, и это реально крутой плейлист!)
Я декораторы начал изучать после того, как захотел написать телеграм-бот, и тут Остапа понесло... >>> Что такое декораторы >>> что такое замыкание >>> что такое вложенные функции....что такое глобальные, локальные и иже с ними переменные.... Как будто квесты в игре проходишь, берешь один квест, по дороге еще 10 штук набираешь))) Зато тренируешься, вспоминаешь основы, закрепляешь их и т.д.
+++ где-то год назад уже смотрел весь этот курс, пришлось напоминать себе что такое замыкание
Это было божественное объяснение. Структурированно, не слишком быстро, советы про *args и *kwargs. Благодарю.
**
Не переигрывай пельмень
Прекрасно все объяснил! Большое спасибо))))))
Большое спасибо, Артем.
наконец все стало понятно
Ты вообще красава! Все понятно и информативно) Продолжай в том же духе и не забрасывай канал))
наконец то, хоть кто-то доступно на пальцах объяснил 👍
О, какая крутая штука ! Спасибо большое за доступное объяснение!
Очень доступно. Спасибо
Все понятно и доходчиво. Спасибо.
Купи мир.... Такой интересный призыв)))
жирный лайк, спасибо большое Вам.
Я кажется понел, благодарю!
Твои объяснения для меня пока что лучшие, я их понимаю (может и не с первого раза), но со второго точно)))
Очень круто и информативно)
Подача информации просто невероятна)
Артем, спасибо большое!
Круууто!
Офигенно. Реально каждое действие объясняете и всё максимально понятно) Подписка
Что? Каждое действие ?Сам себя похвалил и наоайкал. "Чтобы понимать декораторы нужно знать замыкание, вот эта функция будет замыканием..." ништяк обьяснюха...продолжу а вот это декоратор не хуже обьяснил правда?
@@user-fw7dn9ib1j чел, надо было курс смотреть этот... он об замыканиях говорил...
Тёма, ты лучший
Спасибо за видео!
Я на платном курсе обучаюсь и без видосов в ютубе никак.
Сейчас происходит то, что я с помощью твоих видео лучше все усваиваю. Либо это до меня доходит со второго раза (типа шлифую те знания, что получил на курсе), либо ты очень хорошо все раскладываешь)
Но в любом случае, комментарий для всех:
Чтобы понять тему с декораторами, советую начать с просмотра видео "Вложенные функции" и поочереди идти по каждому видосу. Сейчас я наконец-то все понял) Спасибо)
до этого видео я не понял что такое дикораторы, спасибо вам большое 🙂
Спасибо за доступ ко всем материалам, после окончания курса по питону, буду брать ООП
Спасибо, тебе, дружище!!)
а так спасибо все равно))) понимаю что вас нужно поддерживать!
весь ролик очень понятный
твоё видео помогло мне, другие не помогали. Я так и не вынимал суть декораторов до твоего видео. Спасибо большое! Продолжай в том же духе! :) Подписался и разослал друзьям.
Спасибо!
спасибо за видео
Почему нельзя сказать что декоратор выставляет перед функцией в него входящей как раз таки декоративное сообщение или элемент, и так же может сделать после результата функции в нём? Понапишут своих высокоинтеллектуальных текстов, а потом переводи на человеческий по пол часа.
Супер подача!
По качеству нахожу сходство c Ильёй Кантором, я у него Git изучал по роликам
Обязательно оформлю подписку на тебя. У меня по питону только ты и Олег Молчанов в приоритетах
@Askhat Moldakasym тоже очень годный канал)
как успехи спустя год?
@@schmoopiegrob8758 blog на flask
второй после молчанова
Как всегда все офигенно)
Спасибо Вам за уроки
Хороший комментарий для Артёма
Super. Spasibo ogromnoe!
наконец то я всё понял
Из всех лекций Артёма, эту я так и не понял, от слова "совсем". Постоянные перескоки с одной функции на другую, и для чего это нужно в коде, так и осталось большой загадкой!
Огромнейшее спасибо, самое доходчивое обьяснение декораторов
Точно! Если, конечно, других не слышал.
О наконец классный контент поддерживаю автора
Спасибо за урок.
PS. Купить Мир.
Спасибо) Очень просто объяснил
Спасибо
Что-то тяжко даётся эта тема. Надеюсь на практике станет понятнее.
Одно из лучших объяснений , по книгам и по лекциям не очень понятно
Что делать, если превышена глубина вложенности? Речь идет о фрагменте кода на 4:05, подскажите кто столкнулся тоже
*ТоП* !
топчик
Т.е. оригинальную функцию без обертки уже не вызвать в данном случае?
Поясните пожалуйста (ролик 3:02):
Когда объявляем, что say будет вызывать функцию декоратора, мы же просто объявляем переменную say, а не пере объявляем функцию, какой смысл в этом?
Не знаю, актуален ли еще вопрос, но на всякий постараюсь пояснить. Все в питоне является объектами, которым можно присвоить имя. Так любая функция является объектом с именем (то, что идет после def). В 16 строке его кода мы просто говорим, что теперь в переменной say будет лежать не старая функция, которая просто пишет привет мир, а там лежит результат работы decorator, то бишь ссылка на функцию inner, которая использует в своем функционале «старую» функцию say.
А твой преподаватель был не случайно Тимофей Хирьянов?😏
нет
Добрый день
У меня давно был вопрос
По какой формуле можно посчитать интеграл и интегральные числа в python?
from sympy import *
var('x')
integrate(sin(x), x)
Пакеты математические, например, SciPy, SymPy поддерживают такие вычисления. Плюс есть численные методы, позволяющие вычислять интегралы (метод Симпсона, 3/8, трапеций и т.д.)
Только благодаря этоому видео я понял что такое декораторы. Спасибо!
Привет. Мне нужно разработать декоратор 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'. В чем ошибка.
Еще просьба сообщить если видео по генераторам. Заранее спасибо.
👍
Артем, Вы прекрасно все объяснили...но я ни хера не понял даже с третьего раза :(
Я вообще все что запомнил что у него есть платный канал
Блин, две недели, две недели бился т только щас въехал 😂 Спасибо за уроки!
Я до сих пор не понимаю больше половины материала, но понял, хоть что-то, когда поигрался с кодом тут:
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)()
Где вы взяли такой интересный пример?)
жаль в кризис не могу стать патрионом, не посмотреть многих видео
Привет
Какие модули надо знать для создания нормальной программ в питон
Смотря какой тип программы?
Web приложения, desktop & mobile приложения, скрапперы, игры, Искусственный интелект?
@@user-gh1nb7dv2g например decktop
Для всех этих задач есть отдельные модули ?
@@rahmatj0n Конечно, одним модулем ты все не сделаешь, тем более с модулем.
Научись Фреймворкам. Для Desktop & Mobile приложений у Python есть фреймворк Kivy, для сайтов Django & Flask, для скрепперов Scrapy.
И чтобы эффективно работать со всем этим тебе нужно знать разные модули.
@@user-gh1nb7dv2g С чего начать
Как эта собака работает? Почему именно в том месте?
Купить мир.Панимаю
Как купить спонсорство ,номер карты не идёт,всё ввёл номер карты не идёт а ввёл всё правильно ?????
Это не ко мне вопросы. Либо с картой проблемы, либо с ютубом или патреоном
@@egoroffchannel у меня есть приложение которое требует обновлений модулей внутри неё, приложение прислали, и обычный Пип инсталл не работает, также модули я скачиваю через pip instal trusted host....... Потому что проблема с ссл сертификатом, так как обновить модули внутри приложения?
прям множественное наследование с полиморфизмом какоето)
Добрый день! Не могу понять, как аргумент функции func попадает в n в функции inner? По моей логике это нужно сделать так: def decor(func, arg): def inner (): func(arg) ...
указывай тайм код, а то многое меняется в видео.
Сначала say становится inner, а затем уже вызывается якобы inner и уже в него передается аргумент n. Если не поймешь, попробую переобъяснить, раньше у самого проблемы с этим были) Главное посидеть, вникнуть, не торопится.
@@user-wk9dl9lu2t Декораторы хорошо понимаете?)
@@capitulation27 из видео этого понял.
@@user-wk9dl9lu2t А что-то параллельно читаете?
"Hello world" and " Buy world" 🤣🤣🤣In my opinion, it should have been "Bye world, not Buy"
Мы купим весь мир)
Чтобы понять то, что здесь рассказываю, посмотри предыдущий материал, но он платный. Прикольно)) Автор конечно сам решает, как монетизировать контент, но как то смысла нет тогда здесь что-то искать полезное, когда ту же информацию можно получить на соседнем канале бесплатно. Понятно, что по ютубу не выучишь питон, информация не систематезирована, так еще и неотделимая часть только для спонсоров. Тогда имеет смысл весь контент только по подписке. Подумал тут еще, что стоимость живого подписчика (не бота) в схожей тематике на 2021г, если привлекать его через рекламу (например адвордс), может колебаться до 150-250 р. Не хотелось бы, чтобы кнопка "Спонсировать" и жадность авторов, убили бы тему доступного образования на Ютуб. Возможности для заработка у канала то никто не отнимал - вон и ссылки на продвижение платных продуктов в описании. Такой способ монетизации больше похож на манипуляцию) В итоге, потратил время, вопрос остался не закрыт. Вопрос: зачем мне такой канал в подписках? Да вроде не зачем. Развернутый коммент для продвижения видео - в подарок;) Отписка.
"buy world" - амбициозно...
Обьяснитн максимально просто что значит вернуть вложенную функцию без вызова пожалуйста
th-cam.com/video/To2Q7bRubHw/w-d-xo.html
вот здесь говорится, что такое ВЫЗОВ объекта
Блин, Артем, как же это бесит. В твоем курсе по Python на Stepik не показывается этот долбанный неправильный тест, поэтому из-за этого одно задание можно решать неделю т.к я не могу понять, почему Failed test #4 of 16. Хоть я подставляю все возможные значения и программа работает, но ответ не засчитывается. КАК ЖЕ ЭТО РАЗДРАЖАЕТ(((
курс еще в этапе разработки
какое задание? и какое у тебя решение?
Непонятно зачем нужна функция 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
в питоне что возвращает функция, когда не указан return?
@@egoroffchannel true or false?
@@reqam7969 None
10:14 скрытый байт
А когда этотнужно на практике?
В ооп много встроеных декораторов используются, @property @classmethod @staticmethod и подобное
Как смотрю, так фольксваген напоминает: Садишься такой в машину норм комплектации, за последние бабки, а там куча зуглушек :). Типо чо не мог побогаче комплектацию купить, нищеброд. И не надо вот, что бесплатно... время тоже стоит. дороже ничего нет. Но автору респект. Понятно.
привет мир, купить мир
Привет мир, я хочу тебя купить... ))) --buy--
Купи мир
Вообще ничего непонятно, что откуда берётся, почему в функцию пишем не заданные перменные. Я вообще в шоке, что код этот запускается, это видимо магия какая-то программирования. Тут переменная ля функций задаётся лишь в самом конце, крч бред, я пока не понимаю.
Объясняет как боженька, но стал жадничать в последнее время) Хотя, согласен, что любой труд должен оплачиваться.
Либо пусть полностью платный, либо нет.
Неполная информация не имеет смысла. (как трейлер перед выходом фильма)
@@azar4ik1 но благодаря трейлерам, мы можем захотеть пойти на фильм. Да и в целом понять что он из себя представляет
Замыкание это не передача функции в функцию....это больше о замыкании ссылок на значение в памяти......исходя из этого обьяснение уже фундаментально не верно
Ничего не понял.. Какой-то неудачный пример... Лучше на чем-нибудь полезном показывать, где это можно применить.
А
как-то слишком все запутано и непонятно
Здрасьте: "Этот контент нельзя приобрести."
значит вы не житель РФ
на патреоне можно оформить спонсорскую подписку
@@egoroffchannel не, патреон меня не интересует. жаль
@@DoktorZlo96 vpn? Proxy?
How the fuck did I come here?
Кто-то мне объяснит зачем декораторы нужны? Чтобы функция выводила дополнительную строку? ДОПИШИ В ФУНКЦИЮ МЛИН!! Унаследовать из другого участка кода? ИСПОЛЬЗУЙ НАСЛЕДОВАНИЕ и не порти код своего коллеги кодом, который теперь будет вызываться с его функцией всегда и о котором он ничего не знал!
Такое впечатление что программисты просто любят себе проблемы создавать!
Больно сложно пишешь, чем на самом деле. Для разнообразия хоть имена функциям давать разные
где одинаковые они?
Ну почему все "учителя" объясняют все исключительно через пень колоду?
Декоратор 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()
ты думаешь лучше объяснил?
вот читает новичок твой коммент: _"это функция, которая берет в качестве аргумента функцию foo. После чего запись foo(без вызова) аналогично decor(foo)"_
сразу вопросы - что за foo такой? что такое "foo(без вызова)"?
итд
так что в своем глазу соломинку не видим
@@Das.Kleine.Krokodil
А для кого я кусок кода вставил? Ты чо не видишь кнопку "читать дальше"?
Автор же нафигачил каких то заумностей, каких то сложных функций в функции, да еще и язык HTML зачем то сюда вогнал.
А что касается "новичка"(не того которым Навального отравили) Так новичок, прежде чем изучать функции с декораторами, должен знать что такое просто функция, и что ее можно запускать.
@@user-gf6er4ug6g у тебя плохой пример, потому что он ничего не делает и нет аргументов функций
@@Das.Kleine.Krokodil Может и плохой, и не идеальный, но тут хотя бы передана основная идея декораторов, что строчка @decor перед def foo можно заменить строчкой foo = decor(foo) после ввода этих функций Это главное, то что автор так и не передал, а уж брать агрументы - это вообще частный случай.
А то что здесь автор наворочал - мне ни фига не помогло разобраться. Пришлось методом научного тыка.
@@Das.Kleine.Krokodil Я для кого писал строчку с комментарием "здесь могут быть переменные"? Прочитай сначала потом пиши.