Урок #5 = Пройден Из этого урока я понял: -- То что self мы используем в методах, когда собираемся создавать и работать непосредственно с экземлярами класса -- @classmethod когда работаем ТОЛЬКО внутри самого класса -- А @staticmethod только когда нам нужен независимый метод, который не будет, и не должен обращаться к локальным, и к любым другим атрибутам, и переменным Спасибо за урок :)
это не первое видео, про класс методы и статические методы, которое я смотрел, но это первое видео, по которому я понял, зачем они нужны!! ))) Спасибо!
@@andrewc3942 Декораторы @classmethod и @staticmethod позволяют унифицировать вызовы методов, которые они декорируют, т.е. вызывать их с использованием одинакового синтаксиса вне зависимоти от того, передается или нет при вызове неявный параметр. Вызов self.validate(5) первым парамертом неявно передает self. Вызов Vector.validate(5) не передает неявный параметр, хотя он нужен.Декоратор @classmethod заботится об этом, добавляя неявный параметр. Вызов Vector.norm2(5, 6) не передает неявынй параметр. Вызов self.norm2(5, 6) передает невный параметр, хотя он не нужен. Декоратор @staticmethod заботится об этом, удаляя неявный параметр. Использование этих декораторов позволяет вызывать статические методы и методы класса без явного указания имени класса (в нашем случае это Vector), устраняя таким образом привязку кода к конкретному имени класса. И при этом вызывать эти методы единообразно, не заботясь о нюансах передачи неявного параметра, т.к. эту заботу берут на себя декораторы.
@@andrewc3942 Представьте матрёшку , в одной 3 вложения ,в другой 2 в 3м экземпляре нет вложений - она такая какая есть. Они все разных цветов . И вот вас просят показать - определенный цвет. ЗЫ - объяснил как мог ) если не прав поправьте.
Я очень разочаровался после просмотра этого видео!😫 Так как я понял, что ПОПАЛ НА ДЕНЬГИ! А именно в том, что я записался на платный курс "Python разработчика" с последующим трудоустройством, пересматривал лекции в течении 3-х месяцев и понял из представленного материала только то, что автор того курса типа "крутой программист" и ничего не понял по делу. И вот совершенно случайно я попал на это видео и за каких то 14 минут все стало более чем понятно! АВТОРУ КАНАЛА ИСКРЕННЕ ОГРОМНОЕ СПАСИБО ЗА ГРАМОТНЫЕ И ПОНЯТНЫЕ УРОКИ!👍
Тоже не плохо учиться платно. На курсах скорее всего можно в онлайн обсуждать темы с преподами, да и они так сказать пинать будут учиться. А вот самоучкам бывает порою просто лень заниматься...
@@игорянвасилюк Исходя из моего личного опыта , заниматься не лень , а скорее всего боязнь того , что бесплатные курсы не эффективны , а вот после третьей платной лекции желание учиться и действительно начало пропадать , но
у автора на степике есть платный курс по ООП там еще можно закрепить знания решая различные задачи. Мне понадобилось почти 3 месяца чтобы пройти бесплатный базовый курс, много сил и времени отнимали эти задачи, зато сейчас более менее нормально ориентируюсь в языке. Еще месяц изучал парсинг и теперь с Божьей помощью могу и парсингом заниматься. Теперь вот пришлось вернуться к этому автору уже чтобы ООП подтянуть для дальнейшего развития в питоне. Со знанием ООП уже можно и джанго изучать и на телеграм боты нацелиться. Хотя для последнего нужно еще уметь писать асинхронный код
Спасибо большое за доходчивое объяснение! Если бы еще в конце видео предлогалось какое нибудь практическое занятие, связанное с реальными задачами, было бы вообще супер класс! Канал топ!
6:47 Возможно, было бы еще правильнее написать type(self).validate(x). Потому что при вызове функции от self, может возникнуть ложное понимание, что функция как-то воспользуется атрибутами экземпляра.
Спасибо за уроки, очень интересно! Надеюсь, скоро выучусь и все же поменяю работу на программиста) Недавно начал учить django по книге, там все хорошо объяснялось, но знаний основ не хватало, прям очень сложно было следить за тем, что и для чего мы пишем, так что решил для начала по ООП пройтись и тут такой хороший курс! Да, я понимаю, что вряд ли научусь делать такие вещи, какие уже сделаны в django или других фреймворках, но зато буду понимать те принципы, которые там применяются и со временем дойду до создания таких вещей с 0
До этого видео вчера все шло отлично. Но видимо отвлекли мысли и что то упустил. Сейчас, на следующий день, пересмотрел, все ок. Соглашусь с человеком который оставил комментарий ниже. У Вас талант! Даже на собачках и кошечках у Вас получается достучаться до моего 50 ти летнего мозга. Ну а что, грешен, пошел учиться на программиста. ))))
мне 14 лет хочу стать Backend програмистом нашел у вас курс по джанго на 1 уроке надо знать ооп пошел искать опять нашео канал вот уже 5 ролик смотрю ето просто идиальное обясненейе я немогу передать словами большое спасибо!
Как работают статические методы и методы класса вы объяснили, но для чего они на практике нет. Я могу сделать обыкновенную функцию валидации х и у, которая отработает точно так же. наверно, надо было добавить больше про наследование, про экземпляры класса, где метод класса будет работать в каждом по своему, например, создать еще один экземпляр класса, поменять значения min и max. Наверно, стоило эту тему поднимать после изучения наследования и полиморфизма.
Ну почему же? Я понял для чего и зачем это. Например ф-ция с self - что то делает с атрибутами экземпляра, но не может с атрибутами класса С cls - работает с атрибутами класса, но не экземпляра А статическая - универсальная, может работать везде и со всеми,если это требуется Остается просто использовать то,что нужно будет в ситуации
@@morphinewrld6927 Хотя думаю,что в очень скором времени куплю курс на степике. Теория круто, конспекты веду в письменном виде, но без теории знания я чувствую как забываются
Подытожим: Декораторы "@staticmethod" и "@classmethod" в Python используются для определения методов, которые могут быть вызваны без создания экземпляра класса. Однако, есть разница в том, как они работают: 1. "@staticmethod": - Статический метод не требует доступа к экземпляру класса или его атрибутам. - Он может быть вызван как метод класса или через экземпляр класса. - В качестве первого аргумента не передается экземпляр класса или класс, что позволяет использовать его для общих операций, не связанных с конкретным экземпляром. - Обычно используется для группировки функциональности, которая относится к классу, но не зависит от конкретного экземпляра. 2. "@classmethod": - Метод класса принимает класс (`cls`) в качестве первого аргумента, а не экземпляр класса. - Он может быть вызван как метод класса или через экземпляр класса. - Позволяет работать с атрибутами класса, а не только с экземплярами. - Часто используется для создания альтернативных конструкторов или для доступа к атрибутам класса. Таким образом, основное различие между "@staticmethod" и "@classmethod" заключается в том, что статический метод не имеет доступа к классу или экземпляру, в то время как метод класса имеет доступ к классу через параметр "cls".
У автора даже в голосе очки 🥽 чувствуются😂😂, в воображение рисует классического клишированного программиста из 90, не в обиду говорю) а так курс хороший, тема объясняется доступно и понятно , большое человеческое спасибо за плейлист!
Мне кажется, это нужно чисто для построения красивой архитектуры приложения. Скажем, если надо сделать какие то независимые от класса действия, но нужные для его работы в будущем, было б некрасиво пилить одинокую функцию вне класса. А так можно привязать независимую функцию к классу, будто они из одной коробки.
Для тех, у кого как и у меня возникли вопросы, что конкретно делают декораторы и что если их закомментировать: @staticmethod: не сможем вызывать через экземпляр класса, первым параметром будет передаваться ссылка на экземпляр, метод будет получать больше параметров, чем ожидает - ошибка, через класс вызывать можно. @classmethod - та же шляпа, через экземпляр в любом случае идет первой ссылка на экземпляр, через класс первым придется явно передать ссылку на класс, декоратор именно это и сделает сам.
Вообще не верно! @staticmethod - это, по факту, независимая функция внутри класса, которая не имеет доступа ни к атрибутам класса, ни к атрибутам экземпляра, а работает только с собственными входными значениями (и не требует ни ссылки на экземпляр ни ссылки на класс, так как не имеет к ним доступа!). И при этом может быть вызван как классом, так и его экземпляром (просто без передачи атрибутов). То есть, этот метод делает всё тоже самое что и обычная функция вне класса, но в данном случае, он определён внутри него, для каких-то специфических операций. @classmethod - это метод который работает исключительно со значениями класса! Первым параметром автоматически передаётся cls (ссылка на текущий класс) и соответственно у даного метода есть доступ к атрибутам класса и дополнительным параметрам, которые мы можем ему прописать. Но у него нет доступа к атрибутам экземпляров (для этого юзаються обычные методы) и вызывая его из экземпляра, у него по прежнему останется доступ только к атрибутам класса.
@@alucardv8551 Девочка лишь написала, зачем эти методы оборачивают в декораторы, и что будет, если этого не делать. И не правы здесь именно Вы. Вы разъясняете смысл самих методов, а говорите, что это делают декораторы этих методов. Так что, если доебываться, то по большому)))
У меня такой же вопрос как и у других - зачем? То что в видео объяснили - это понятно. 3 метода: 1н универсальный, другой только для работы внутри класса (вызывается через класс, а не экземпляры), третий это по сути обычная функция (без всяких там self, cls и т.п. внутренних относительных ссылок). Но это все - как объяснить, что вот формула силы тока. Запомните. Мол так и так, подставляем данные - получается сила тока. Все. А для чего это? Почему нам недостаточно 1-го универсального метода? Зачем понадобился метод класса? И зачем статический метод? Ведь все можно делать в том методе, где self, верно же я понял? Там даже имя класса подставляется как-то само через self, как будто это ссылки на экземпляр этого класса мало. cls, видимо, не так красиво уже. Это english-style, когда в одно слово втыкают 30 смыслов. И подбирай смысл потом по контексту)) Вот с синглтонами было понятно, иногда нужно ограничить кол-во экземпляров класса одним, там где это вызывает конфликты или ради безопасности. А тут?
Это тоже для безопасности и во избежание конфликтов. Например (аналогия с синглтоном, те же яйца, но только в профиль), у вас есть поле, которое должно быть единым для любых экземпляров этого класса, и если любой экземпляр изменит это поле, то оно должно изменится и у других. Если это сделать без декоратора, то метод будет считать это поле локальным и изменит его только для текущего экземпляра, но не изменит для других. Как правило такие поля делают приватными и доступ к ним возможен только через методы класса. Вот пример, вместо тысячи слов. Обратите внимание, что умышленно заменены self и cls на единое pipiska. Ведь это всего лишь ссылка на объект, и не важно, как она называется. По-разному называют исключительно ради удобства. В первом случае (без декоратора) в pipiska будет подставлена ссылка на объекты a и b, во втором случае - ссылка на класс Translator. class Translator: delay = 0 def request(pipiska): pipiska.delay += 1 def get_delay(pipiska): return pipiska.delay a = Translator() print(f"Before request object A: delay = {a.get_delay()}") a.request() print(f"After request object A: delay = {a.get_delay()}") b = Translator() print(f"Before request object B: delay = {b.get_delay()}") b.request() print(f"After request object B: delay = {b.get_delay()}") print("----------------") a.delay = 10 print(f"Current value for object A: delay = {a.delay}") print(f"Get value for object A: delay = {a.get_delay()}") Результат: Before request object A: delay = 0 After request object A: delay = 1 Before request object B: delay = 0 After request object B: delay = 1 ---------------- Current value for object A: delay = 10 Get value for object A: delay = 10 А теперь с декоратором: class Translator: delay = 0 @classmethod def request(pipiska): pipiska.delay += 1 @classmethod def get_delay(pipiska): return pipiska.delay a = Translator() print(f"Before request object A: delay = {a.get_delay()}") a.request() print(f"After request object A: delay = {a.get_delay()}") b = Translator() print(f"Before request object B: delay = {b.get_delay()}") b.request() print(f"After request object B: delay = {b.get_delay()}") print("----------------") a.delay = 10 print(f"Current value for object A: delay = {a.delay}") print(f"Get value for object A: delay = {a.get_delay()}") Результат: Before request object A: delay = 0 After request object A: delay = 1 Before request object B: delay = 1 After request object B: delay = 2 ---------------- Current value for object A: delay = 10 Get value for object A: delay = 2 Обратили внимание как во втором случае все изменения, производимые экземпляром А, повлияли на исходный класс, и экземпляр Б был создан с учетом этих изменений? Где применимо - простой пример: у вас есть класс, у которого метод делает запрос на сервер и несколько экземпляров этого класса. Но сервер работает так, что запросы надо отправлять не чаще, чем раз в 50 мс с одного IP. Мы создали в классе поле last_request, для запоминания последнего обращения. Если это поле после запроса обновлять методом без декоратора, то текущий экземпляр А всегда будет знать, когда он обратился к методу запроса в последний раз, но понятия не имеет, обращался ли до него другой экземпляр Б, а Б, в свою очередь, ничего не знает о действиях А. И легко может выйти так, что А получит данные, а Б - отказ в доступе, т.к. прошло недостаточно времени, после обращения А. Решение проблемы очевидно - поле last_request должно изменяться и анализироваться исключительно методами класса с декораторами @classmethod. Принцип «разделяй и властвуй» - каждая часть кода должна заниматься своей работой. PS и да, мы имеем возможность обойтись и без декоратора, например, в обычном методе вызвать прямое указание на изменение поля класса через указание прямого имени этого класса (Translator.delay = 1000), но это дурной тон.
Огонь, спасибо за объяснение! Кажется, начинаю понимать задумку в целом. В питоне есть гибкость, когда одну и ту же логическую конструкцию можно сделать разными способами. Но при этом, рекомендуется делать это явным, рекомендованным способом, чтобы другие разработчики сразу поняли твой код. Некое соглашение. Типа, вот мы придумали помечать декоратором @classmethod те методы в классе, что работают с его приватными свойствами, значит лучше использовать его. Он делает это удобнее и нагляднее. @@MevErex
Возможно, кому-нибудь поможет. Помимо остальных вопросов меня больше всего беспокоила нуждa в staticmethod, т.к все прекрасно работает с методом без параметра self. Разница в том, что если к нему обращаться уже из класса или вне класса через экземпляр, то в него будет передаваться параметр self и выходить ошибка. Со статич. методом это исключается.
До жирафа наконец дошло как работают эти декораторы. И всё же вопрос остался. Какие практические задачи смогу решить используя возможности обращения только к атрибутам класса и статическим методам. Т.е. цель их назначения я понял, не понял зачем мне это. Поясните плиз или пример из жизни.
Кто может помочь, я не понял в чем разница, потому что так тоже работает ? class Vector: MIN_COORD = 10 MAX_COORD = 100 @classmethod def validate(cls, arg): return cls.MIN_COORD
Это тоже для безопасности и во избежание конфликтов. Например (аналогия с синглтоном, те же яйца, но только в профиль), у вас есть поле, которое должно быть единым для любых экземпляров этого класса, и если любой экземпляр изменит это поле, то оно должно изменится и у других. Если это сделать без декоратора, то метод будет считать это поле локальным и изменит его только для текущего экземпляра, но не изменит для других. Как правило такие поля делают приватными и доступ к ним возможен только через методы класса. Вот пример, вместо тысячи слов. Обратите внимание, что умышленно заменены self и cls на единое pipiska. Ведь это всего лишь ссылка на объект, и не важно, как она называется. По-разному называют исключительно ради удобства. В первом случае (без декоратора) в pipiska будет подставлена ссылка на объекты a и b, во втором случае - ссылка на класс Translator. class Translator: delay = 0 def request(pipiska): pipiska.delay += 1 def get_delay(pipiska): return pipiska.delay a = Translator() print(f"Before request object A: delay = {a.get_delay()}") a.request() print(f"After request object A: delay = {a.get_delay()}") b = Translator() print(f"Before request object B: delay = {b.get_delay()}") b.request() print(f"After request object B: delay = {b.get_delay()}") print("----------------") a.delay = 10 print(f"Current value for object A: delay = {a.delay}") print(f"Get value for object A: delay = {a.get_delay()}") Результат: Before request object A: delay = 0 After request object A: delay = 1 Before request object B: delay = 0 After request object B: delay = 1 ---------------- Current value for object A: delay = 10 Get value for object A: delay = 10 А теперь с декоратором: class Translator: delay = 0 @classmethod def request(pipiska): pipiska.delay += 1 @classmethod def get_delay(pipiska): return pipiska.delay a = Translator() print(f"Before request object A: delay = {a.get_delay()}") a.request() print(f"After request object A: delay = {a.get_delay()}") b = Translator() print(f"Before request object B: delay = {b.get_delay()}") b.request() print(f"After request object B: delay = {b.get_delay()}") print("----------------") a.delay = 10 print(f"Current value for object A: delay = {a.delay}") print(f"Get value for object A: delay = {a.get_delay()}") Результат: Before request object A: delay = 0 After request object A: delay = 1 Before request object B: delay = 1 After request object B: delay = 2 ---------------- Current value for object A: delay = 10 Get value for object A: delay = 2 Обратили внимание как во втором случае все изменения, производимые экземпляром А, повлияли на исходный класс, и экземпляр Б был создан с учетом этих изменений? Где применимо - простой пример: у вас есть класс, у которого метод делает запрос на сервер и несколько экземпляров этого класса. Но сервер работает так, что запросы надо отправлять не чаще, чем раз в 50 мс с одного IP. Мы создали в классе поле last_request, для запоминания последнего обращения. Если это поле после запроса обновлять методом без декоратора, то текущий экземпляр А всегда будет знать, когда он обратился к методу запроса в последний раз, но понятия не имеет, обращался ли до него другой экземпляр Б, а Б, в свою очередь, ничего не знает о действиях А. И легко может выйти так, что А получит данные, а Б - отказ в доступе, т.к. прошло недостаточно времени, после обращения А. Решение проблемы очевидно - поле last_request должно изменяться и анализироваться исключительно методами класса с декораторами @classmethod. Принцип «разделяй и властвуй» - каждая часть кода должна заниматься своей работой. PS и да, мы имеем возможность обойтись и без декоратора, например, в обычном методе вызвать прямое указание на изменение поля класса через указание прямого имени этого класса (Translator.delay = 1000), но это дурной тон.
Было не понятно, для чего вообще нужен декоратор, ведь по идее и без него бы всё хорошо работало, поэтому сам поигрался в VScode и вот что мы имеем: 1) Self и cls обычные переменные и могут быть названны как вам удобно, даже если сама среда разработки вам их автоматически ставит, вы можете их переименовать. Просто это общепринятые наименования. 2) Следуя из первого у нас получается, что если убрать декоратор classmethod, то cls превращается в условный self, которому нужна ссылка на экземпляр класса, иначе выдаёт ошибку о нехватке аргументов, если вызывается через сам класс. 3)Если декоратор стоит, при этом если вызывать метод класса через экземпляр класса, то всё работает так же прекрасно если и вызывать через сам класс. Но при этом, если в экземпляре класса переопределены поля, например: max_coord и min_coord, то ничего не изменется, так как cls при наличии декоратора неявно принимает аргументом ссылку на класс, от которого произошёл экземпляр, следовательно и использует его значения. как итог, получаем, что декоратор меняет логику неявного присваивания значений первым аргументам(self или cls)
10:32 , несколько раз пересматривал и отматывал, но так и не понял из чего получился ответ "500" ? Если будет возможность, ответьте пожалуйста в ответе на коментарий=)
Можете ответить, что Вы имеете в виду, когда говорите декоратор? Просто я нахожу определение: это функция, которая имеет как аргумент другую функцию, дополняет и возвращает её. Или может сама запись @staticmethod и есть декоратор?
class MyClass: class_count = 0 @classmethod def class_calls(cls): cls.class_count += 1 def __init__(self,value): self.value = value self.class_calls() вот так наверное?
Осталось черным ящиком, как эти декораторы влияют на методы. Приходится искать инфу самому. Например, если не указать в статистическом методе декоратор @staticmethod, то его нельзя будет вызывать через ссылку на объект класса. Если мы укажем методу этот декоратор, то мы сможем это сделать. Получается, декоратор декорирует ф-цию так, чтобы она обходила передачу аргумента self. Это мое предположение. Тема раскрывается не полностью и очень обидно за это
потому что декораторы объяснялись в другом курсе Балакирева , на степике он бесплатен называется "Добрый, добрый Python с Сергеем Балакиревым". Декораторы обязательно нужно изучить и понять, потому что они много где используются в том числе и в ООП, а вместе с ними замыкающие функции.
Не понял. Зачем @staticmethod нужен в классе если он не работает с атрибутами класса? Легче может тогда не засорять класс и отдельную функцию создать? Я новичок в этом и буду благодарен за доходчивое объяснение
например, метод используется для проверки корректности данных, такую функцию выносить за пределы класса не очень, логичнее прописать внутри как статическую
@@selfedu_rus вопрос конечно не по теме , не подскажете , как сделать запрос Django ORM используя ForiegnKey в обратную сторону. Допустим есть модели к ним марки, сделать выборку по моделям и попутно зацепить марки в одном запросе ?
здесь смысл, что вы можете вызывать метод validate непосредственно через класс: Vector.validate(5) а то что можно и из объекта: v.validate(5) никто не запрещает
@@selfedu_rus ну это некоторое ограничение на функционал. Но я уже понял, что оба этих декоратора по сути меняют то как метод воспринимает первый аргумент, и не важно как этот аргумент называется. Раньше я думал, что self и cls это ключевые слова. А оказывается что первый аргумент это всегда по умолчанию ссылка на экземпляр (за исключением метода ___new___ и мб еще каких-то магических). Спасибо за ответ и за плейлист)
хм я делал атрибуты класса которые менялось от простых self функций и потом другой не не наследованный класс их читал чтобы делать че то, наверное я сделал что называется говнокод)
Вам нужно осознать, что в Пайтоне всё объект. Функция, класс, экземпляр класса, метод - всё это объекты. А имена (переменные) только ссылаются на эти объекты. И рассматривать всё в терминах создания в памяти объектов и ссылок на эти объекты. Если понимать что где когда создаётся и что на что ссылается, то ООП начинает казаться логичным ))) Если вы не можете ответить на вопросы (см. ниже), то скорей всего ООП дальше будет трудно понимать ) 1. Когда создаётся объект класса (не экземпляр класса, а именно объект самого класса) ? 2. Как происходит создание объекта экземпляра класса (это когда мы пишем pt = Point()) ? 3. Когда происходит создание объекта метода класса (то есть как функция внутри класса превращается в метод) ? 4. Что происходит при вызове метода класса ? 5. def foo(self): - что здесь такое self ?
Женя хорошо все описал, так что советую погуглить ответы на вопросы, если сам не знаешь. Но я попробую объяснить немного проще. По сути класс - это некий шаблон\комплектовщик методов для объекта. Например, нам надо создать машину(как объект) и дать возможность настраивать параметры для нее. Для этого можно создать класс, в котором можно, например, менять цвет и размер определенной машины, просто вызвав метод класса этой машины. т.е. class Car: def __init__(self, size, color): self.size = size self.color = color def change_color(self, color): self.color = color def change_size(self, size): self.size= size ## Метод для print def __str__(self): return f"Размер машины - {self.size} метров Цвет машины - {self.color}" Все. Теперь можно создавать сколько угодно таких машин и каждой, независимо от других, менять цвет и размер. Например: car1 = Car(1, "green") car2 = Car(2, "red") car1.change_color("blue") car2.change_size("black") print(f"Первая машина: {car1}") print(f"Вторая машина: {car2}") Как видишь - это два совершенно разных экземпляра, имеющие одинаковые методы, которые позволяют в разы проще, быстрее и лаконичнее менять их "личные" данные.
@@mantrida Пожалуй отвечу на ваши вопросы, если что не так пожалуйста поправьте. 1) Объект класса создается при его инициализации 2) Создание экземпляра - это то что вы указали в скобках. 3) Создание метода класса происходит при объявлении класса (при создании класса создаются его атрибуты, а функция, являющаяся атрибутом класса, является методом) 4) При вызове метода класса выводится возможность метода обращаться к экземпляру класса 5) Это параметр, который ссылается на экземпляр класса
@@agility3554 1) Объект класса создается при его инициализации Что такое инициализация класса ? Инициализация переменной знаю, это когда присваивается значение a = 5. А где инициализация класса ? 2) Создание экземпляра - это то что вы указали в скобках. Не конкретно, вопрос был как ? 3) Создание метода класса происходит при объявлении класса То есть вот мы пишем программу, объявили метод и он сразу создался в памяти ? Даже без запуска программы ? 4) При вызове метода класса выводится возможность метода обращаться Не понял что значит 'возможность метода обращаться' ? Метод это функция в которую передаются аргументы. Куда она обращается ? Пока что всё очень сильно расплывчато... Давайте конкретней )) Вот мы написали программу. И запустили её на выполнение. Ещё раз что именно происходит по этим 4 пунктам при запуске ? class A: def __init__(self, x): self.x = x def get_x(self): return self.x a = A(5) print(a.get_x()) 5) Это параметр, который ссылается на экземпляр класса А где вы видите класс ?: ))
ты тупо не объясняешь для чего они нужны ты пишешь на их основе точно такие же функции которые можно было бы написать и без них. Как понять тогда зачем они вообще нужны, не понятно где и для чего это пригодится
Я, кстати, заметил, что функции (подобно свойствам) можно использовать не только в качестве атрибута класса, но и в качестве локального атрибута экземпляра класса. Это как-то используется?
Очень классная подача , зашел вспомнить про классы и методы, думал задержусь на пару видео , а тут прям затянуло))
Урок #5 = Пройден
Из этого урока я понял:
-- То что self мы используем в методах, когда собираемся создавать и работать непосредственно с экземлярами класса
-- @classmethod когда работаем ТОЛЬКО внутри самого класса
-- А @staticmethod только когда нам нужен независимый метод, который не будет, и не должен обращаться к локальным, и к любым другим атрибутам, и переменным
Спасибо за урок :)
это не первое видео, про класс методы и статические методы, которое я смотрел, но это первое видео, по которому я понял, зачем они нужны!! ))) Спасибо!
зачем? так и не понял для чего они нужны и зачем их использовать?
@@andrewc3942
Декораторы @classmethod и @staticmethod позволяют унифицировать вызовы методов, которые они декорируют, т.е. вызывать их с использованием одинакового синтаксиса вне зависимоти от того, передается или нет при вызове неявный параметр.
Вызов self.validate(5) первым парамертом неявно передает self.
Вызов Vector.validate(5) не передает неявный параметр, хотя он нужен.Декоратор @classmethod заботится об этом, добавляя неявный параметр.
Вызов Vector.norm2(5, 6) не передает неявынй параметр.
Вызов self.norm2(5, 6) передает невный параметр, хотя он не нужен. Декоратор @staticmethod заботится об этом, удаляя неявный параметр.
Использование этих декораторов позволяет вызывать статические методы и методы класса без явного указания имени класса (в нашем случае это Vector), устраняя таким образом привязку кода к конкретному имени класса. И при этом вызывать эти методы единообразно, не заботясь о нюансах передачи неявного параметра, т.к. эту заботу берут на себя декораторы.
Ничего не понял, но очень интересно
@@andrewc3942 Представьте матрёшку , в одной 3 вложения ,в другой 2 в 3м экземпляре нет вложений - она такая какая есть. Они все разных цветов . И вот вас просят показать - определенный цвет. ЗЫ - объяснил как мог ) если не прав поправьте.
Спасибо большое ! - у вас талант к преподаванию :-) более толкового объяснения - я еще в жизни не встречал!
Класс , информативное видео без воды . В конце подвёл итог , за это отдельный респект.
всё прояснилось на моменте финального подведения итогов урока во время второго просмотра)
доходчиво. спасибо.
Огромная благодарность за ваш труд! Очень полезный материал с исключительно понятным объяснением.
Спасибо за урок, очень не хватает задач по темам. Было бы клево на практике немного это все вкусить!
Я очень разочаровался после просмотра этого видео!😫
Так как я понял, что ПОПАЛ НА ДЕНЬГИ!
А именно в том, что я записался на платный курс "Python разработчика" с последующим трудоустройством, пересматривал лекции в течении 3-х месяцев и понял из представленного материала только то, что автор того курса типа "крутой программист" и ничего не понял по делу.
И вот совершенно случайно я попал на это видео и за каких то 14 минут все стало более чем понятно!
АВТОРУ КАНАЛА ИСКРЕННЕ ОГРОМНОЕ СПАСИБО ЗА ГРАМОТНЫЕ И ПОНЯТНЫЕ УРОКИ!👍
Тоже не плохо учиться платно. На курсах скорее всего можно в онлайн обсуждать темы с преподами, да и они так сказать пинать будут учиться. А вот самоучкам бывает порою просто лень заниматься...
@@игорянвасилюк Исходя из моего личного опыта , заниматься не лень , а скорее всего боязнь того , что бесплатные курсы не эффективны , а вот после третьей платной лекции желание учиться и действительно начало пропадать , но
у автора на степике есть платный курс по ООП там еще можно закрепить знания решая различные задачи. Мне понадобилось почти 3 месяца чтобы пройти бесплатный базовый курс, много сил и времени отнимали эти задачи, зато сейчас более менее нормально ориентируюсь в языке. Еще месяц изучал парсинг и теперь с Божьей помощью могу и парсингом заниматься. Теперь вот пришлось вернуться к этому автору уже чтобы ООП подтянуть для дальнейшего развития в питоне. Со знанием ООП уже можно и джанго изучать и на телеграм боты нацелиться. Хотя для последнего нужно еще уметь писать асинхронный код
Вы просто идеальный учитель !!!!! всё быстро и понятно !!!! спасибо
Как мысли прочитал. Думал освежить это. Всегда путался когда что надо.
Было большой удачей найти ваш сайт, а после еще и канал)
Огромное спасибо, объясняете просто превосходно, даже такому дубу как я все понятно с первого раза!)Успехов, жму руку!
Спасибо большое за доходчивое объяснение!
Если бы еще в конце видео предлогалось какое нибудь практическое занятие,
связанное с реальными задачами, было бы вообще супер класс!
Канал топ!
братишка такое есть заходи на стенки там есть задания и целый курс этого человека!!!
@@ВладимирРодионов-з2т Приветствую! Можно подробней, "на стенки" - это куда?
@@ЕгорСмирнов-ь8ж на степик я думаю предыдущий оратор хотел сказать
@@arcinvicta спасибо
@@ЕгорСмирнов-ь8ж вообще, посмотри! Там много толковых курсов по пайтону недорогих, или, даже совсем бесплатных!!!
год назад,у меня не получалось сделать банальные вещи,какой же кайф то ощущение,что мне наконец то все понятно!
6:47
Возможно, было бы еще правильнее написать type(self).validate(x). Потому что при вызове функции от self, может возникнуть ложное понимание, что функция как-то воспользуется атрибутами экземпляра.
автор просто легенда, спасибо за детство
Всё чётко и понятно)
Искал одну конкретную тему, нашел ваше видео. Так понравилось, что начал весь курс смотреть. Спасибо вам большое!
Огромное спасибо за ваш труд
Я прям кайфую с этого канала! Очень круто
Я ВАС ОЧЕНЬ ЛЮБЛЮ СПАСИБО ВАМ ОГРОМНОЕ ЗА ВСЁ
Вот это супер объяснение! Спасибо!
гениальный учитель
Спасибо. Отлично. Все понятно.
Сергей, благодарю! Отличная работа!! 👍🔥
Спасибо за уроки, очень интересно! Надеюсь, скоро выучусь и все же поменяю работу на программиста)
Недавно начал учить django по книге, там все хорошо объяснялось, но знаний основ не хватало, прям очень сложно было следить за тем, что и для чего мы пишем, так что решил для начала по ООП пройтись и тут такой хороший курс!
Да, я понимаю, что вряд ли научусь делать такие вещи, какие уже сделаны в django или других фреймворках, но зато буду понимать те принципы, которые там применяются и со временем дойду до создания таких вещей с 0
Скажите пожалуйста название книги. Тоже нужно django изучить
До этого видео вчера все шло отлично. Но видимо отвлекли мысли и что то упустил. Сейчас, на следующий день, пересмотрел, все ок. Соглашусь с человеком который оставил комментарий ниже. У Вас талант! Даже на собачках и кошечках у Вас получается достучаться до моего 50 ти летнего мозга. Ну а что, грешен, пошел учиться на программиста. ))))
50 лет - это не предел. Мне 65, но тоже с интересом постигаю азы программирования. Успехов!
Офигеть, у вас дар ясно объяснять. Спасибо!
Это же великолепно. Нет, ну правда.
мне 14 лет хочу стать Backend програмистом нашел у вас курс по джанго на 1 уроке надо знать ооп пошел искать опять нашео канал вот уже 5 ролик смотрю ето просто идиальное обясненейе я немогу передать словами большое спасибо!
Спасибо! Успехов!!!
Отличные уроки. Спасибо
Как работают статические методы и методы класса вы объяснили, но для чего они на практике нет. Я могу сделать обыкновенную функцию валидации х и у, которая отработает точно так же. наверно, надо было добавить больше про наследование, про экземпляры класса, где метод класса будет работать в каждом по своему, например, создать еще один экземпляр класса, поменять значения min и max. Наверно, стоило эту тему поднимать после изучения наследования и полиморфизма.
Согласен @selfedu здесь явно просчитался
Ну почему же? Я понял для чего и зачем это.
Например ф-ция с self - что то делает с атрибутами экземпляра, но не может с атрибутами класса
С cls - работает с атрибутами класса, но не экземпляра
А статическая - универсальная, может работать везде и со всеми,если это требуется
Остается просто использовать то,что нужно будет в ситуации
@@gggutya ты вполне также можешь обращаться к атрибутам класса и изменять их, даже из функции с self
@@morphinewrld6927 Да, за столько времени я это выяснил, но не задумывался, зачем же тогда cls нужно раз и с self все нормально работает
@@morphinewrld6927 Хотя думаю,что в очень скором времени куплю курс на степике. Теория круто, конспекты веду в письменном виде, но без теории знания я чувствую как забываются
Подытожим:
Декораторы "@staticmethod" и "@classmethod" в Python используются для определения методов, которые могут быть вызваны без создания экземпляра класса. Однако, есть разница в том, как они работают:
1. "@staticmethod":
- Статический метод не требует доступа к экземпляру класса или его атрибутам.
- Он может быть вызван как метод класса или через экземпляр класса.
- В качестве первого аргумента не передается экземпляр класса или класс, что позволяет использовать его для общих операций, не связанных с конкретным экземпляром.
- Обычно используется для группировки функциональности, которая относится к классу, но не зависит от конкретного экземпляра.
2. "@classmethod":
- Метод класса принимает класс (`cls`) в качестве первого аргумента, а не экземпляр класса.
- Он может быть вызван как метод класса или через экземпляр класса.
- Позволяет работать с атрибутами класса, а не только с экземплярами.
- Часто используется для создания альтернативных конструкторов или для доступа к атрибутам класса.
Таким образом, основное различие между "@staticmethod" и "@classmethod" заключается в том, что статический метод не имеет доступа к классу или экземпляру, в то время как метод класса имеет доступ к классу через параметр "cls".
У автора даже в голосе очки 🥽 чувствуются😂😂, в воображение рисует классического клишированного программиста из 90, не в обиду говорю) а так курс хороший, тема объясняется доступно и понятно , большое человеческое спасибо за плейлист!
Чем то напомнило урок математики в школе. Как считать объяснили, а для чего это нужно - нет!
Мне кажется, это нужно чисто для построения красивой архитектуры приложения. Скажем, если надо сделать какие то независимые от класса действия, но нужные для его работы в будущем, было б некрасиво пилить одинокую функцию вне класса. А так можно привязать независимую функцию к классу, будто они из одной коробки.
Спасибо за урок, как всегда просто песня, не захочешь быть программистом, а станешь
Всё суперпонятно. Спасибо!
Для тех, у кого как и у меня возникли вопросы, что конкретно делают декораторы и что если их закомментировать:
@staticmethod: не сможем вызывать через экземпляр класса, первым параметром будет передаваться ссылка на экземпляр, метод будет получать больше параметров, чем ожидает - ошибка, через класс вызывать можно.
@classmethod - та же шляпа, через экземпляр в любом случае идет первой ссылка на экземпляр, через класс первым придется явно передать ссылку на класс, декоратор именно это и сделает сам.
Вообще не верно!
@staticmethod - это, по факту, независимая функция внутри класса, которая не имеет доступа ни к атрибутам класса, ни к атрибутам экземпляра, а работает только с собственными входными значениями (и не требует ни ссылки на экземпляр ни ссылки на класс, так как не имеет к ним доступа!). И при этом может быть вызван как классом, так и его экземпляром (просто без передачи атрибутов).
То есть, этот метод делает всё тоже самое что и обычная функция вне класса, но в данном случае, он определён внутри него, для каких-то специфических операций.
@classmethod - это метод который работает исключительно со значениями класса! Первым параметром автоматически передаётся cls (ссылка на текущий класс) и соответственно у даного метода есть доступ к атрибутам класса и дополнительным параметрам, которые мы можем ему прописать. Но у него нет доступа к атрибутам экземпляров (для этого юзаються обычные методы) и вызывая его из экземпляра, у него по прежнему останется доступ только к атрибутам класса.
@@alucardv8551 Девочка лишь написала, зачем эти методы оборачивают в декораторы, и что будет, если этого не делать. И не правы здесь именно Вы. Вы разъясняете смысл самих методов, а говорите, что это делают декораторы этих методов. Так что, если доебываться, то по большому)))
@@ДенисМедведев-о7д ты вот и доебался, белый защитник, она написала что НЕ СМОЖЕМ ВЫЗВАТЬ, хотя это делается спокойно
пишите cls в classmethod, но помните, что можно и self и eklmn
питон не привередливый. съест всё
в отличие от собеседователя
Спасибо, посмотрела! Учусь по вашим урокам, задания для закрепления ищу в интернете, если знаете хороший ресурс буду рада подсказке)
Спасибо! На Stepik масса хороших практических курсов. На один из них ссылка под этим видео. Успехов!
У меня такой же вопрос как и у других - зачем? То что в видео объяснили - это понятно. 3 метода: 1н универсальный, другой только для работы внутри класса (вызывается через класс, а не экземпляры), третий это по сути обычная функция (без всяких там self, cls и т.п. внутренних относительных ссылок).
Но это все - как объяснить, что вот формула силы тока. Запомните. Мол так и так, подставляем данные - получается сила тока. Все. А для чего это? Почему нам недостаточно 1-го универсального метода? Зачем понадобился метод класса? И зачем статический метод? Ведь все можно делать в том методе, где self, верно же я понял? Там даже имя класса подставляется как-то само через self, как будто это ссылки на экземпляр этого класса мало. cls, видимо, не так красиво уже. Это english-style, когда в одно слово втыкают 30 смыслов. И подбирай смысл потом по контексту)) Вот с синглтонами было понятно, иногда нужно ограничить кол-во экземпляров класса одним, там где это вызывает конфликты или ради безопасности. А тут?
Это тоже для безопасности и во избежание конфликтов. Например (аналогия с синглтоном, те же яйца, но только в профиль), у вас есть поле, которое должно быть единым для любых экземпляров этого класса, и если любой экземпляр изменит это поле, то оно должно изменится и у других. Если это сделать без декоратора, то метод будет считать это поле локальным и изменит его только для текущего экземпляра, но не изменит для других. Как правило такие поля делают приватными и доступ к ним возможен только через методы класса.
Вот пример, вместо тысячи слов. Обратите внимание, что умышленно заменены self и cls на единое pipiska. Ведь это всего лишь ссылка на объект, и не важно, как она называется. По-разному называют исключительно ради удобства. В первом случае (без декоратора) в pipiska будет подставлена ссылка на объекты a и b, во втором случае - ссылка на класс Translator.
class Translator:
delay = 0
def request(pipiska):
pipiska.delay += 1
def get_delay(pipiska):
return pipiska.delay
a = Translator()
print(f"Before request object A: delay = {a.get_delay()}")
a.request()
print(f"After request object A: delay = {a.get_delay()}")
b = Translator()
print(f"Before request object B: delay = {b.get_delay()}")
b.request()
print(f"After request object B: delay = {b.get_delay()}")
print("----------------")
a.delay = 10
print(f"Current value for object A: delay = {a.delay}")
print(f"Get value for object A: delay = {a.get_delay()}")
Результат:
Before request object A: delay = 0
After request object A: delay = 1
Before request object B: delay = 0
After request object B: delay = 1
----------------
Current value for object A: delay = 10
Get value for object A: delay = 10
А теперь с декоратором:
class Translator:
delay = 0
@classmethod
def request(pipiska):
pipiska.delay += 1
@classmethod
def get_delay(pipiska):
return pipiska.delay
a = Translator()
print(f"Before request object A: delay = {a.get_delay()}")
a.request()
print(f"After request object A: delay = {a.get_delay()}")
b = Translator()
print(f"Before request object B: delay = {b.get_delay()}")
b.request()
print(f"After request object B: delay = {b.get_delay()}")
print("----------------")
a.delay = 10
print(f"Current value for object A: delay = {a.delay}")
print(f"Get value for object A: delay = {a.get_delay()}")
Результат:
Before request object A: delay = 0
After request object A: delay = 1
Before request object B: delay = 1
After request object B: delay = 2
----------------
Current value for object A: delay = 10
Get value for object A: delay = 2
Обратили внимание как во втором случае все изменения, производимые экземпляром А, повлияли на исходный класс, и экземпляр Б был создан с учетом этих изменений?
Где применимо - простой пример: у вас есть класс, у которого метод делает запрос на сервер и несколько экземпляров этого класса. Но сервер работает так, что запросы надо отправлять не чаще, чем раз в 50 мс с одного IP. Мы создали в классе поле last_request, для запоминания последнего обращения.
Если это поле после запроса обновлять методом без декоратора, то текущий экземпляр А всегда будет знать, когда он обратился к методу запроса в последний раз, но понятия не имеет, обращался ли до него другой экземпляр Б, а Б, в свою очередь, ничего не знает о действиях А. И легко может выйти так, что А получит данные, а Б - отказ в доступе, т.к. прошло недостаточно времени, после обращения А.
Решение проблемы очевидно - поле last_request должно изменяться и анализироваться исключительно методами класса с декораторами @classmethod. Принцип «разделяй и властвуй» - каждая часть кода должна заниматься своей работой.
PS и да, мы имеем возможность обойтись и без декоратора, например, в обычном методе вызвать прямое указание на изменение поля класса через указание прямого имени этого класса (Translator.delay = 1000), но это дурной тон.
Огонь, спасибо за объяснение! Кажется, начинаю понимать задумку в целом. В питоне есть гибкость, когда одну и ту же логическую конструкцию можно сделать разными способами.
Но при этом, рекомендуется делать это явным, рекомендованным способом, чтобы другие разработчики сразу поняли твой код. Некое соглашение. Типа, вот мы придумали помечать декоратором @classmethod те методы в классе, что работают с его приватными свойствами, значит лучше использовать его. Он делает это удобнее и нагляднее.
@@MevErex
@@MevErex чувак, ты гений
Возможно, кому-нибудь поможет. Помимо остальных вопросов меня больше всего беспокоила нуждa в staticmethod, т.к все прекрасно работает с методом без параметра self. Разница в том, что если к нему обращаться уже из класса или вне класса через экземпляр, то в него будет передаваться параметр self и выходить ошибка. Со статич. методом это исключается.
Спасибо!
Спасибо!
интересный урок, спасибо
Спасибо огромное!
Сасибо большое!
от души
До жирафа наконец дошло как работают эти декораторы. И всё же вопрос остался. Какие практические задачи смогу решить используя возможности обращения только к атрибутам класса и статическим методам. Т.е. цель их назначения я понял, не понял зачем мне это. Поясните плиз или пример из жизни.
Далее еще будут примеры с их использованием
Кто может помочь, я не понял в чем разница, потому что так тоже работает ?
class Vector:
MIN_COORD = 10
MAX_COORD = 100
@classmethod
def validate(cls, arg):
return cls.MIN_COORD
Это тоже для безопасности и во избежание конфликтов. Например (аналогия с синглтоном, те же яйца, но только в профиль), у вас есть поле, которое должно быть единым для любых экземпляров этого класса, и если любой экземпляр изменит это поле, то оно должно изменится и у других. Если это сделать без декоратора, то метод будет считать это поле локальным и изменит его только для текущего экземпляра, но не изменит для других. Как правило такие поля делают приватными и доступ к ним возможен только через методы класса.
Вот пример, вместо тысячи слов. Обратите внимание, что умышленно заменены self и cls на единое pipiska. Ведь это всего лишь ссылка на объект, и не важно, как она называется. По-разному называют исключительно ради удобства. В первом случае (без декоратора) в pipiska будет подставлена ссылка на объекты a и b, во втором случае - ссылка на класс Translator.
class Translator:
delay = 0
def request(pipiska):
pipiska.delay += 1
def get_delay(pipiska):
return pipiska.delay
a = Translator()
print(f"Before request object A: delay = {a.get_delay()}")
a.request()
print(f"After request object A: delay = {a.get_delay()}")
b = Translator()
print(f"Before request object B: delay = {b.get_delay()}")
b.request()
print(f"After request object B: delay = {b.get_delay()}")
print("----------------")
a.delay = 10
print(f"Current value for object A: delay = {a.delay}")
print(f"Get value for object A: delay = {a.get_delay()}")
Результат:
Before request object A: delay = 0
After request object A: delay = 1
Before request object B: delay = 0
After request object B: delay = 1
----------------
Current value for object A: delay = 10
Get value for object A: delay = 10
А теперь с декоратором:
class Translator:
delay = 0
@classmethod
def request(pipiska):
pipiska.delay += 1
@classmethod
def get_delay(pipiska):
return pipiska.delay
a = Translator()
print(f"Before request object A: delay = {a.get_delay()}")
a.request()
print(f"After request object A: delay = {a.get_delay()}")
b = Translator()
print(f"Before request object B: delay = {b.get_delay()}")
b.request()
print(f"After request object B: delay = {b.get_delay()}")
print("----------------")
a.delay = 10
print(f"Current value for object A: delay = {a.delay}")
print(f"Get value for object A: delay = {a.get_delay()}")
Результат:
Before request object A: delay = 0
After request object A: delay = 1
Before request object B: delay = 1
After request object B: delay = 2
----------------
Current value for object A: delay = 10
Get value for object A: delay = 2
Обратили внимание как во втором случае все изменения, производимые экземпляром А, повлияли на исходный класс, и экземпляр Б был создан с учетом этих изменений?
Где применимо - простой пример: у вас есть класс, у которого метод делает запрос на сервер и несколько экземпляров этого класса. Но сервер работает так, что запросы надо отправлять не чаще, чем раз в 50 мс с одного IP. Мы создали в классе поле last_request, для запоминания последнего обращения.
Если это поле после запроса обновлять методом без декоратора, то текущий экземпляр А всегда будет знать, когда он обратился к методу запроса в последний раз, но понятия не имеет, обращался ли до него другой экземпляр Б, а Б, в свою очередь, ничего не знает о действиях А. И легко может выйти так, что А получит данные, а Б - отказ в доступе, т.к. прошло недостаточно времени, после обращения А.
Решение проблемы очевидно - поле last_request должно изменяться и анализироваться исключительно методами класса с декораторами @classmethod. Принцип «разделяй и властвуй» - каждая часть кода должна заниматься своей работой.
PS и да, мы имеем возможность обойтись и без декоратора, например, в обычном методе вызвать прямое указание на изменение поля класса через указание прямого имени этого класса (Translator.delay = 1000), но это дурной тон.
это не мой ответ, я его скопировал)
просто лучший 👍👍👍
Очень доходчиво!!! Спасибо
Інтересно і полезно!
Топчик ваще
Было не понятно, для чего вообще нужен декоратор, ведь по идее и без него бы всё хорошо работало, поэтому сам поигрался в VScode и вот что мы имеем:
1) Self и cls обычные переменные и могут быть названны как вам удобно, даже если сама среда разработки вам их автоматически ставит, вы можете их переименовать. Просто это общепринятые наименования.
2) Следуя из первого у нас получается, что если убрать декоратор classmethod, то cls превращается в условный self, которому нужна ссылка на экземпляр класса, иначе выдаёт ошибку о нехватке аргументов, если вызывается через сам класс.
3)Если декоратор стоит, при этом если вызывать метод класса через экземпляр класса, то всё работает так же прекрасно если и вызывать через сам класс. Но при этом, если в экземпляре класса переопределены поля, например: max_coord и min_coord, то ничего не изменется, так как cls при наличии декоратора неявно принимает аргументом ссылку на класс, от которого произошёл экземпляр, следовательно и использует его значения.
как итог, получаем, что декоратор меняет логику неявного присваивания значений первым аргументам(self или cls)
10:32 , несколько раз пересматривал и отматывал, но так и не понял из чего получился ответ "500" ? Если будет возможность, ответьте пожалуйста в ответе на коментарий=)
500 получается для вектора (10, 20) = 100 + 400 = 500, всю эту конкретику проще в телеграм-канале по Python спрашивать (ссылка под видео).
Можете ответить, что Вы имеете в виду, когда говорите декоратор? Просто я нахожу определение: это функция, которая имеет как аргумент другую функцию, дополняет и возвращает её. Или может сама запись @staticmethod и есть декоратор?
См. занятие по Python декораторам (или вопрос в ТГ-канал по Python). Вам быстро ответят )
Чем дальше в лес, тем страшнее волки!
спасибо!
А как можно посчитать количество созданных экземпляров класса? и вывести это в переменную
class MyClass:
class_count = 0
@classmethod
def class_calls(cls):
cls.class_count += 1
def __init__(self,value):
self.value = value
self.class_calls()
вот так наверное?
Осталось черным ящиком, как эти декораторы влияют на методы. Приходится искать инфу самому. Например, если не указать в статистическом методе декоратор @staticmethod, то его нельзя будет вызывать через ссылку на объект класса. Если мы укажем методу этот декоратор, то мы сможем это сделать. Получается, декоратор декорирует ф-цию так, чтобы она обходила передачу аргумента self. Это мое предположение.
Тема раскрывается не полностью и очень обидно за это
потому что декораторы объяснялись в другом курсе Балакирева , на степике он бесплатен называется "Добрый, добрый Python с Сергеем Балакиревым". Декораторы обязательно нужно изучить и понять, потому что они много где используются в том числе и в ООП, а вместе с ними замыкающие функции.
Речь не о декораторах в общем, а конкретно про эти два. Про их внутреннюю реализацию 0 слов. Просто используйте их вот так и все. Поверьте на слово
Курс хороший! А можно примеры, где могут пригодиться данные декораторы?
в Django, Flask, Tensorflow, Keras
спасибо
Super!
Perfect!
следовало показать ошибки но всё равно норм
Так? Получается что self делает переменные из локальных в глобальные? И обращение к нему упрощается?
self - это ссылка на объект класса и все!!!
@@selfedu_rus Ok
Не понял. Зачем @staticmethod нужен в классе если он не работает с атрибутами класса? Легче может тогда не засорять класс и отдельную функцию создать? Я новичок в этом и буду благодарен за доходчивое объяснение
например, метод используется для проверки корректности данных, такую функцию выносить за пределы класса не очень, логичнее прописать внутри как статическую
👍👍👍👍👍
были бы еще домашки)), а так все отлично
они есть (ссылка под видео на курс по ООП)
здравствуйте, для чего сами надписи на функциями, они только для обозначения что бы програмист понимал что они делают, или они несут функционал?
вы про эти: @classmethod? Это декораторы. Если не знаете тему, то в курсе по Python (обычном) об этом рассказывается.
Доброе время суток, не до конца понял для чего это(
далее будут примеры
@@selfedu_rus вопрос конечно не по теме , не подскажете , как сделать запрос Django ORM используя ForiegnKey в обратную сторону. Допустим есть модели к ним марки, сделать выборку по моделям и попутно зацепить марки в одном запросе ?
Если много зависимостей , то prefetch_related, если одна select_related может кому пригодиться ))
@@donfedor007 prefetch_related для many to many, select_related для many to one
@@MrArtlex так то я ответил уже))))
👍
А зачем тут декораторы? или без них это не работает?
работает, я проверил)
круто
так зачем писать @classmethod @staticmethod если их убрать, то программа будет работать также.
так принято, если метод не использует локальные атрибуты объектов и класса, то статик, если только класса, то классовый, а иначе, как по умолчанию
А зачем нужны эти декораторы? Если их убрать все продолжает работать.
Вам подробно об этом расскажет сообщество телеграм-канала (ссылка под видео)
шик
Ну Сергей, как ты сам-то все это понимаешь???
Не совсем понял смысл этих методов. Ведь я могу вызвать для объекта, а не класса метод validate()
v.validate(5). И в чем весь цимус?
здесь смысл, что вы можете вызывать метод validate непосредственно через класс:
Vector.validate(5)
а то что можно и из объекта:
v.validate(5)
никто не запрещает
@@selfedu_rus спасибо за ответ. Я понял что могу, просто пока сейчас на том уровне знания языка, что еще не понимаю зачем. То есть где это применимо.
cls - это сокращение от каких слов?
class
5:40
Я не заметил, что поменяется, если декоратор staticmethod просто не писать. Просто написать метод, который не имеет параметра self или cls.
из staticmethod нельзя обратиться к локальный атрибутам объекта, т.к. на объект просто нет ссылки
@@selfedu_rus ну это некоторое ограничение на функционал. Но я уже понял, что оба этих декоратора по сути меняют то как метод воспринимает первый аргумент, и не важно как этот аргумент называется. Раньше я думал, что self и cls это ключевые слова. А оказывается что первый аргумент это всегда по умолчанию ссылка на экземпляр (за исключением метода ___new___ и мб еще каких-то магических). Спасибо за ответ и за плейлист)
Что за редактор используется?
Camtasia Studio
@@selfedu_rus tnx)
@@selfedu_rus оу, я не точно задал вопрос, я имел ввиду - "редактор кода")
@@ВикторИгнатов-м9е PyCharm
Ох, Сергей, опять декораторами завлёк!
Почему 61????????
5*5 + 6*6 = 61
хм я делал атрибуты класса которые менялось от простых self функций и потом другой не не наследованный класс их читал чтобы делать че то, наверное я сделал что называется говнокод)
Ойойой, то ли я тупой,но никак не могу это ООП понять. Уже много раз пересмотрел все видосы, ну никак!!!!
Вам нужно осознать, что в Пайтоне всё объект. Функция, класс, экземпляр класса, метод - всё это объекты. А имена (переменные) только ссылаются на эти объекты. И рассматривать всё в терминах создания в памяти объектов и ссылок на эти объекты. Если понимать что где когда создаётся и что на что ссылается, то ООП начинает казаться логичным )))
Если вы не можете ответить на вопросы (см. ниже), то скорей всего ООП дальше будет трудно понимать )
1. Когда создаётся объект класса (не экземпляр класса, а именно объект самого класса) ?
2. Как происходит создание объекта экземпляра класса (это когда мы пишем pt = Point()) ?
3. Когда происходит создание объекта метода класса (то есть как функция внутри класса превращается в метод) ?
4. Что происходит при вызове метода класса ?
5. def foo(self): - что здесь такое self ?
Женя хорошо все описал, так что советую погуглить ответы на вопросы, если сам не знаешь.
Но я попробую объяснить немного проще.
По сути класс - это некий шаблон\комплектовщик методов для объекта.
Например, нам надо создать машину(как объект) и дать возможность настраивать параметры для нее.
Для этого можно создать класс, в котором можно, например, менять цвет и размер определенной машины, просто вызвав метод класса этой машины.
т.е.
class Car:
def __init__(self, size, color):
self.size = size
self.color = color
def change_color(self, color):
self.color = color
def change_size(self, size):
self.size= size
## Метод для print
def __str__(self):
return f"Размер машины - {self.size} метров
Цвет машины - {self.color}"
Все. Теперь можно создавать сколько угодно таких машин и каждой, независимо от других, менять цвет и размер. Например:
car1 = Car(1, "green")
car2 = Car(2, "red")
car1.change_color("blue")
car2.change_size("black")
print(f"Первая машина: {car1}")
print(f"Вторая машина: {car2}")
Как видишь - это два совершенно разных экземпляра, имеющие одинаковые методы, которые позволяют в разы проще, быстрее и лаконичнее менять их "личные" данные.
@@proxxxy01 Спасибо, теперь более понятно.
@@mantrida Пожалуй отвечу на ваши вопросы, если что не так пожалуйста поправьте. 1) Объект класса создается при его инициализации 2) Создание экземпляра - это то что вы указали в скобках. 3) Создание метода класса происходит при объявлении класса (при создании класса создаются его атрибуты, а функция, являющаяся атрибутом класса, является методом) 4) При вызове метода класса выводится возможность метода обращаться к экземпляру класса 5) Это параметр, который ссылается на экземпляр класса
@@agility3554 1) Объект класса создается при его инициализации
Что такое инициализация класса ? Инициализация переменной знаю, это когда присваивается значение a = 5. А где инициализация класса ?
2) Создание экземпляра - это то что вы указали в скобках.
Не конкретно, вопрос был как ?
3) Создание метода класса происходит при объявлении класса
То есть вот мы пишем программу, объявили метод и он сразу создался в памяти ? Даже без запуска программы ?
4) При вызове метода класса выводится возможность метода обращаться
Не понял что значит 'возможность метода обращаться' ? Метод это функция в которую передаются аргументы. Куда она обращается ?
Пока что всё очень сильно расплывчато... Давайте конкретней ))
Вот мы написали программу. И запустили её на выполнение. Ещё раз что именно происходит по этим 4 пунктам при запуске ?
class A:
def __init__(self, x):
self.x = x
def get_x(self):
return self.x
a = A(5)
print(a.get_x())
5) Это параметр, который ссылается на экземпляр класса
А где вы видите класс ?: ))
Ничего не понятно… надо пересматривать до тошнотиков
Сижу и дкмаю - кто поставил ети дисслайки ..
сколько ни читал про эти декораторы, всё равно не понимаю, на кой это надо
см. курс по Flask или Django, они там на каждом шагу ))
Слишком быстро объясняешь для новичка, но в целом ок
ты тупо не объясняешь для чего они нужны ты пишешь на их основе точно такие же функции которые можно было бы написать и без них. Как понять тогда зачем они вообще нужны, не понятно где и для чего это пригодится
Я уже подумал что это у меня динамики дребезжат так противно, одел наушники такой же звук)
Посмотрела аналогичное видео у Никиты Хохлова. Краткость сестра таланта. У вас все очень размыто, слишком много информации, конкретики мало.
Не очень понятно объясняете, слишком быстро, примеры невнятные, очень жаль
Я, кстати, заметил, что функции (подобно свойствам) можно использовать не только в качестве атрибута класса, но и в качестве локального атрибута экземпляра класса. Это как-то используется?
Говор у тебя , как будто я передачу смотрю в мире животных
Спасибо
7:20