#5. Методы класса (classmethod) и статические методы (staticmethod) | ООП Python

Поделиться
HTML-код
  • Опубликовано: 20 ноя 2021
  • Курс по Python ООП: stepik.org/a/116336
    Декораторы @classmethod и @staticmethod для определения методов классов и статических методов. Что это такое и как работают узнаете из этого видео.
    Инфо-сайт: proproprogs.ru/python_oop
    Telegram-канал: t.me/python_selfedu

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

  • @user-vm1df5rs8i
    @user-vm1df5rs8i 6 дней назад +1

    Вы просто идеальный учитель !!!!! всё быстро и понятно !!!! спасибо

  • @voldemar957
    @voldemar957 2 года назад +21

    Я очень разочаровался после просмотра этого видео!😫
    Так как я понял, что ПОПАЛ НА ДЕНЬГИ!
    А именно в том, что я записался на платный курс "Python разработчика" с последующим трудоустройством, пересматривал лекции в течении 3-х месяцев и понял из представленного материала только то, что автор того курса типа "крутой программист" и ничего не понял по делу.
    И вот совершенно случайно я попал на это видео и за каких то 14 минут все стало более чем понятно!
    АВТОРУ КАНАЛА ИСКРЕННЕ ОГРОМНОЕ СПАСИБО ЗА ГРАМОТНЫЕ И ПОНЯТНЫЕ УРОКИ!👍

    • @user-wp9os7ce9l
      @user-wp9os7ce9l 2 года назад +5

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

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

      @@user-wp9os7ce9l Исходя из моего личного опыта , заниматься не лень , а скорее всего боязнь того , что бесплатные курсы не эффективны , а вот после третьей платной лекции желание учиться и действительно начало пропадать , но

    • @orthodox-chanel
      @orthodox-chanel Год назад +3

      у автора на степике есть платный курс по ООП там еще можно закрепить знания решая различные задачи. Мне понадобилось почти 3 месяца чтобы пройти бесплатный базовый курс, много сил и времени отнимали эти задачи, зато сейчас более менее нормально ориентируюсь в языке. Еще месяц изучал парсинг и теперь с Божьей помощью могу и парсингом заниматься. Теперь вот пришлось вернуться к этому автору уже чтобы ООП подтянуть для дальнейшего развития в питоне. Со знанием ООП уже можно и джанго изучать и на телеграм боты нацелиться. Хотя для последнего нужно еще уметь писать асинхронный код

  • @andrewbelikov8772
    @andrewbelikov8772 Год назад +43

    это не первое видео, про класс методы и статические методы, которое я смотрел, но это первое видео, по которому я понял, зачем они нужны!! ))) Спасибо!

    • @andrewc3942
      @andrewc3942 Год назад +4

      зачем? так и не понял для чего они нужны и зачем их использовать?

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

      @@andrewc3942
      Декораторы @classmethod и @staticmethod позволяют унифицировать вызовы методов, которые они декорируют, т.е. вызывать их с использованием одинакового синтаксиса вне зависимоти от того, передается или нет при вызове неявный параметр.
      Вызов self.validate(5) первым парамертом неявно передает self.
      Вызов Vector.validate(5) не передает неявный параметр, хотя он нужен.Декоратор @classmethod заботится об этом, добавляя неявный параметр.
      Вызов Vector.norm2(5, 6) не передает неявынй параметр.
      Вызов self.norm2(5, 6) передает невный параметр, хотя он не нужен. Декоратор @staticmethod заботится об этом, удаляя неявный параметр.
      Использование этих декораторов позволяет вызывать статические методы и методы класса без явного указания имени класса (в нашем случае это Vector), устраняя таким образом привязку кода к конкретному имени класса. И при этом вызывать эти методы единообразно, не заботясь о нюансах передачи неявного параметра, т.к. эту заботу берут на себя декораторы.

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

      Ничего не понял, но очень интересно

    • @AlexA-nr3rj
      @AlexA-nr3rj 10 месяцев назад

      @@andrewc3942 Представьте матрёшку , в одной 3 вложения ,в другой 2 в 3м экземпляре нет вложений - она такая какая есть. Они все разных цветов . И вот вас просят показать - определенный цвет. ЗЫ - объяснил как мог ) если не прав поправьте.

  • @vlakin1
    @vlakin1 2 года назад +49

    Спасибо большое ! - у вас талант к преподаванию :-) более толкового объяснения - я еще в жизни не встречал!

  • @petyap7600
    @petyap7600 2 года назад +16

    Как мысли прочитал. Думал освежить это. Всегда путался когда что надо.

  • @beribanyu
    @beribanyu 2 года назад +36

    Спасибо за урок, очень не хватает задач по темам. Было бы клево на практике немного это все вкусить!

  • @johnmazepa
    @johnmazepa 10 месяцев назад +5

    всё прояснилось на моменте финального подведения итогов урока во время второго просмотра)
    доходчиво. спасибо.

  • @so-crypto
    @so-crypto 7 месяцев назад +2

    Класс , информативное видео без воды . В конце подвёл итог , за это отдельный респект.

  • @masahikokimura5268
    @masahikokimura5268 Год назад +4

    Огромное спасибо за ваш труд

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov Год назад +1

    Сергей, благодарю! Отличная работа!! 👍🔥

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

    Было большой удачей найти ваш сайт, а после еще и канал)

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

    Я прям кайфую с этого канала! Очень круто

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

    Вот это супер объяснение! Спасибо!

  • @igorzalutskyi5367
    @igorzalutskyi5367 2 года назад +8

    Всё чётко и понятно)

  • @user-xi8ru1lo7e
    @user-xi8ru1lo7e 8 месяцев назад +1

    Огромное спасибо, объясняете просто превосходно, даже такому дубу как я все понятно с первого раза!)Успехов, жму руку!

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

    Отличные уроки. Спасибо

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

    Офигеть, у вас дар ясно объяснять. Спасибо!

  • @WasWollenWirDrinken
    @WasWollenWirDrinken Месяц назад +1

    автор просто легенда, спасибо за детство

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

    Круто..полезный урок. Спасибо большое!

  • @vladislavgrin7122
    @vladislavgrin7122 Год назад +19

    6:47
    Возможно, было бы еще правильнее написать type(self).validate(x). Потому что при вызове функции от self, может возникнуть ложное понимание, что функция как-то воспользуется атрибутами экземпляра.

  • @sergeyv1534
    @sergeyv1534 2 года назад +41

    Огромная благодарность за ваш труд! Очень полезный материал с исключительно понятным объяснением.

  • @user-tx3mt1zi2d
    @user-tx3mt1zi2d 13 дней назад

    год назад,у меня не получалось сделать банальные вещи,какой же кайф то ощущение,что мне наконец то все понятно!

  • @user-pp4cp2sr6p
    @user-pp4cp2sr6p 2 года назад +17

    Спасибо большое за доходчивое объяснение!
    Если бы еще в конце видео предлогалось какое нибудь практическое занятие,
    связанное с реальными задачами, было бы вообще супер класс!
    Канал топ!

    • @user-rm3ed8tr7z
      @user-rm3ed8tr7z Год назад

      братишка такое есть заходи на стенки там есть задания и целый курс этого человека!!!

    • @user-km9jn7hb8p
      @user-km9jn7hb8p Год назад +1

      @@user-rm3ed8tr7z Приветствую! Можно подробней, "на стенки" - это куда?

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

      @@user-km9jn7hb8p на степик я думаю предыдущий оратор хотел сказать

    • @user-km9jn7hb8p
      @user-km9jn7hb8p Год назад

      @@arcinvicta спасибо

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

      @@user-km9jn7hb8p вообще, посмотри! Там много толковых курсов по пайтону недорогих, или, даже совсем бесплатных!!!

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

    Я ВАС ОЧЕНЬ ЛЮБЛЮ СПАСИБО ВАМ ОГРОМНОЕ ЗА ВСЁ

  • @andredru4278
    @andredru4278 2 месяца назад +1

    Спасибо. Отлично. Все понятно.

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

    Всё суперпонятно. Спасибо!

  • @wizardx_X
    @wizardx_X 10 месяцев назад +2

    Спасибо за уроки, очень интересно! Надеюсь, скоро выучусь и все же поменяю работу на программиста)
    Недавно начал учить django по книге, там все хорошо объяснялось, но знаний основ не хватало, прям очень сложно было следить за тем, что и для чего мы пишем, так что решил для начала по ООП пройтись и тут такой хороший курс!
    Да, я понимаю, что вряд ли научусь делать такие вещи, какие уже сделаны в django или других фреймворках, но зато буду понимать те принципы, которые там применяются и со временем дойду до создания таких вещей с 0

  • @TheRunnerSVO
    @TheRunnerSVO Год назад +24

    Как работают статические методы и методы класса вы объяснили, но для чего они на практике нет. Я могу сделать обыкновенную функцию валидации х и у, которая отработает точно так же. наверно, надо было добавить больше про наследование, про экземпляры класса, где метод класса будет работать в каждом по своему, например, создать еще один экземпляр класса, поменять значения min и max. Наверно, стоило эту тему поднимать после изучения наследования и полиморфизма.

    • @user-jh9vd1xo4g
      @user-jh9vd1xo4g Год назад

      Согласен @selfedu здесь явно просчитался

    • @gggutya
      @gggutya Год назад +4

      Ну почему же? Я понял для чего и зачем это.
      Например ф-ция с self - что то делает с атрибутами экземпляра, но не может с атрибутами класса
      С cls - работает с атрибутами класса, но не экземпляра
      А статическая - универсальная, может работать везде и со всеми,если это требуется
      Остается просто использовать то,что нужно будет в ситуации

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

      @@gggutya ты вполне также можешь обращаться к атрибутам класса и изменять их, даже из функции с self

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

      @@morphinewrld6927 Да, за столько времени я это выяснил, но не задумывался, зачем же тогда cls нужно раз и с self все нормально работает

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

      @@morphinewrld6927 Хотя думаю,что в очень скором времени куплю курс на степике. Теория круто, конспекты веду в письменном виде, но без теории знания я чувствую как забываются

  • @kohfbi4
    @kohfbi4 4 месяца назад +1

    Спасибо огромное!

  • @pullya66
    @pullya66 2 года назад +4

    гениальный учитель

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

    интересный урок, спасибо

  • @user-mp7wq3qz8f
    @user-mp7wq3qz8f 26 дней назад +1

    Это же великолепно. Нет, ну правда.

  • @user-my3jg8mx8n
    @user-my3jg8mx8n 4 месяца назад +1

    Сасибо большое!

  • @photo_graf_khv
    @photo_graf_khv Месяц назад +1

    Спасибо!

  • @EvgeniySakharov
    @EvgeniySakharov 5 месяцев назад +4

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

    • @SherinYuri
      @SherinYuri 14 дней назад

      50 лет - это не предел. Мне 65, но тоже с интересом постигаю азы программирования. Успехов!

  • @_mrmark
    @_mrmark Год назад +24

    Чем то напомнило урок математики в школе. Как считать объяснили, а для чего это нужно - нет!

    • @licantrop609
      @licantrop609 8 месяцев назад +7

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

  • @user-tm9ng7if3t
    @user-tm9ng7if3t 2 года назад +3

    Очень доходчиво!!! Спасибо

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

    спасибо!

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

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

  • @symphonyofscreams
    @symphonyofscreams Месяц назад +1

    от души

  • @gayratsaidakhmedov5451
    @gayratsaidakhmedov5451 3 месяца назад +1

    спасибо

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

    Perfect!

  • @rogersmith3141
    @rogersmith3141 4 месяца назад +1

    Топчик ваще

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

    Super!

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

    Искал одну конкретную тему, нашел ваше видео. Так понравилось, что начал весь курс смотреть. Спасибо вам большое!

  • @random_act
    @random_act 7 месяцев назад +1

    шик

  • @user-et4if5gs8z
    @user-et4if5gs8z 2 года назад +13

    пишите cls в classmethod, но помните, что можно и self и eklmn
    питон не привередливый. съест всё
    в отличие от собеседователя

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

    круто

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

    мне 14 лет хочу стать Backend програмистом нашел у вас курс по джанго на 1 уроке надо знать ооп пошел искать опять нашео канал вот уже 5 ролик смотрю ето просто идиальное обясненейе я немогу передать словами большое спасибо!

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

      Спасибо! Успехов!!!

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

    👍

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

    Інтересно і полезно!

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

    👍👍👍👍👍

  • @user-urfinjuice
    @user-urfinjuice 2 года назад

    Курс хороший! А можно примеры, где могут пригодиться данные декораторы?

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

      в Django, Flask, Tensorflow, Keras

  • @armstrong2790
    @armstrong2790 Год назад +10

    Возможно, кому-нибудь поможет. Помимо остальных вопросов меня больше всего беспокоила нуждa в staticmethod, т.к все прекрасно работает с методом без параметра self. Разница в том, что если к нему обращаться уже из класса или вне класса через экземпляр, то в него будет передаваться параметр self и выходить ошибка. Со статич. методом это исключается.

  • @cirnocirno6101
    @cirnocirno6101 2 года назад +9

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

    • @alucardv8551
      @alucardv8551 2 года назад +4

      Вообще не верно!
      @staticmethod - это, по факту, независимая функция внутри класса, которая не имеет доступа ни к атрибутам класса, ни к атрибутам экземпляра, а работает только с собственными входными значениями (и не требует ни ссылки на экземпляр ни ссылки на класс, так как не имеет к ним доступа!). И при этом может быть вызван как классом, так и его экземпляром (просто без передачи атрибутов).
      То есть, этот метод делает всё тоже самое что и обычная функция вне класса, но в данном случае, он определён внутри него, для каких-то специфических операций.
      @classmethod - это метод который работает исключительно со значениями класса! Первым параметром автоматически передаётся cls (ссылка на текущий класс) и соответственно у даного метода есть доступ к атрибутам класса и дополнительным параметрам, которые мы можем ему прописать. Но у него нет доступа к атрибутам экземпляров (для этого юзаються обычные методы) и вызывая его из экземпляра, у него по прежнему останется доступ только к атрибутам класса.

    • @user-de3op9hs4p
      @user-de3op9hs4p 2 года назад +3

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

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

      @@user-de3op9hs4p ты вот и доебался, белый защитник, она написала что НЕ СМОЖЕМ ВЫЗВАТЬ, хотя это делается спокойно

  • @Elvin_use
    @Elvin_use Месяц назад +1

    Подытожим:
    Декораторы "@staticmethod" и "@classmethod" в Python используются для определения методов, которые могут быть вызваны без создания экземпляра класса. Однако, есть разница в том, как они работают:
    1. "@staticmethod":
    - Статический метод не требует доступа к экземпляру класса или его атрибутам.
    - Он может быть вызван как метод класса или через экземпляр класса.
    - В качестве первого аргумента не передается экземпляр класса или класс, что позволяет использовать его для общих операций, не связанных с конкретным экземпляром.
    - Обычно используется для группировки функциональности, которая относится к классу, но не зависит от конкретного экземпляра.
    2. "@classmethod":
    - Метод класса принимает класс (`cls`) в качестве первого аргумента, а не экземпляр класса.
    - Он может быть вызван как метод класса или через экземпляр класса.
    - Позволяет работать с атрибутами класса, а не только с экземплярами.
    - Часто используется для создания альтернативных конструкторов или для доступа к атрибутам класса.
    Таким образом, основное различие между "@staticmethod" и "@classmethod" заключается в том, что статический метод не имеет доступа к классу или экземпляру, в то время как метод класса имеет доступ к классу через параметр "cls".

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

    👍👍

  • @user-ou7fw1sg1r
    @user-ou7fw1sg1r 2 года назад +7

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

    • @selfedu_rus
      @selfedu_rus  2 года назад +6

      Далее еще будут примеры с их использованием

  • @freeman-strong2789
    @freeman-strong2789 6 месяцев назад

    Можете ответить, что Вы имеете в виду, когда говорите декоратор? Просто я нахожу определение: это функция, которая имеет как аргумент другую функцию, дополняет и возвращает её. Или может сама запись @staticmethod и есть декоратор?

    • @selfedu_rus
      @selfedu_rus  6 месяцев назад +1

      См. занятие по Python декораторам (или вопрос в ТГ-канал по Python). Вам быстро ответят )

  • @user-cb1kz3mv7j
    @user-cb1kz3mv7j 2 месяца назад +2

    У меня такой же вопрос как и у других - зачем? То что в видео объяснили - это понятно. 3 метода: 1н универсальный, другой только для работы внутри класса (вызывается через класс, а не экземпляры), третий это по сути обычная функция (без всяких там self, cls и т.п. внутренних относительных ссылок).
    Но это все - как объяснить, что вот формула силы тока. Запомните. Мол так и так, подставляем данные - получается сила тока. Все. А для чего это? Почему нам недостаточно 1-го универсального метода? Зачем понадобился метод класса? И зачем статический метод? Ведь все можно делать в том методе, где self, верно же я понял? Там даже имя класса подставляется как-то само через self, как будто это ссылки на экземпляр этого класса мало. cls, видимо, не так красиво уже. Это english-style, когда в одно слово втыкают 30 смыслов. И подбирай смысл потом по контексту)) Вот с синглтонами было понятно, иногда нужно ограничить кол-во экземпляров класса одним, там где это вызывает конфликты или ради безопасности. А тут?

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

      Это тоже для безопасности и во избежание конфликтов. Например (аналогия с синглтоном, те же яйца, но только в профиль), у вас есть поле, которое должно быть единым для любых экземпляров этого класса, и если любой экземпляр изменит это поле, то оно должно изменится и у других. Если это сделать без декоратора, то метод будет считать это поле локальным и изменит его только для текущего экземпляра, но не изменит для других. Как правило такие поля делают приватными и доступ к ним возможен только через методы класса.
      Вот пример, вместо тысячи слов. Обратите внимание, что умышленно заменены 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), но это дурной тон.

    • @user-cb1kz3mv7j
      @user-cb1kz3mv7j 2 месяца назад

      Огонь, спасибо за объяснение! Кажется, начинаю понимать задумку в целом. В питоне есть гибкость, когда одну и ту же логическую конструкцию можно сделать разными способами.
      Но при этом, рекомендуется делать это явным, рекомендованным способом, чтобы другие разработчики сразу поняли твой код. Некое соглашение. Типа, вот мы придумали помечать декоратором @classmethod те методы в классе, что работают с его приватными свойствами, значит лучше использовать его. Он делает это удобнее и нагляднее.
      @@MevErex

  • @user-ns8bt8xb7z
    @user-ns8bt8xb7z 8 месяцев назад +1

    А как можно посчитать количество созданных экземпляров класса? и вывести это в переменную

    • @narkotr4fic843
      @narkotr4fic843 4 месяца назад +1

      class MyClass:
      class_count = 0
      @classmethod
      def class_calls(cls):
      cls.class_count += 1
      def __init__(self,value):
      self.value = value
      self.class_calls()
      вот так наверное?

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

    были бы еще домашки)), а так все отлично

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

      они есть (ссылка под видео на курс по ООП)

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

    Чем дальше в лес, тем страшнее волки!

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

    следовало показать ошибки но всё равно норм

  • @Mika-yq5nr
    @Mika-yq5nr 3 месяца назад +1

    Осталось черным ящиком, как эти декораторы влияют на методы. Приходится искать инфу самому. Например, если не указать в статистическом методе декоратор @staticmethod, то его нельзя будет вызывать через ссылку на объект класса. Если мы укажем методу этот декоратор, то мы сможем это сделать. Получается, декоратор декорирует ф-цию так, чтобы она обходила передачу аргумента self. Это мое предположение.
    Тема раскрывается не полностью и очень обидно за это

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

      потому что декораторы объяснялись в другом курсе Балакирева , на степике он бесплатен называется "Добрый, добрый Python с Сергеем Балакиревым". Декораторы обязательно нужно изучить и понять, потому что они много где используются в том числе и в ООП, а вместе с ними замыкающие функции.

    • @Mika-yq5nr
      @Mika-yq5nr 2 месяца назад

      Речь не о декораторах в общем, а конкретно про эти два. Про их внутреннюю реализацию 0 слов. Просто используйте их вот так и все. Поверьте на слово

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

    Так? Получается что self делает переменные из локальных в глобальные? И обращение к нему упрощается?

    • @selfedu_rus
      @selfedu_rus  2 года назад +4

      self - это ссылка на объект класса и все!!!

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

      @@selfedu_rus Ok

  • @user-ms7tx1bk1v
    @user-ms7tx1bk1v Год назад

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

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

      вы про эти: @classmethod? Это декораторы. Если не знаете тему, то в курсе по Python (обычном) об этом рассказывается.

  • @Aram_Madoyan
    @Aram_Madoyan 20 дней назад +2

    Кто может помочь, я не понял в чем разница, потому что так тоже работает ?
    class Vector:
    MIN_COORD = 10
    MAX_COORD = 100
    @classmethod
    def validate(cls, arg):
    return cls.MIN_COORD

  • @user-sj9yp2xc8g
    @user-sj9yp2xc8g Год назад +1

    Не понял. Зачем @staticmethod нужен в классе если он не работает с атрибутами класса? Легче может тогда не засорять класс и отдельную функцию создать? Я новичок в этом и буду благодарен за доходчивое объяснение

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

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

  • @user-bv2di6ix9q
    @user-bv2di6ix9q Год назад

    10:32 , несколько раз пересматривал и отматывал, но так и не понял из чего получился ответ "500" ? Если будет возможность, ответьте пожалуйста в ответе на коментарий=)

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

      500 получается для вектора (10, 20) = 100 + 400 = 500, всю эту конкретику проще в телеграм-канале по Python спрашивать (ссылка под видео).

  • @user-qf7ld3vk6c
    @user-qf7ld3vk6c 2 года назад +1

    Ох, Сергей, опять декораторами завлёк!

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

    Ну Сергей, как ты сам-то все это понимаешь???

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

    cls - это сокращение от каких слов?

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

    Доброе время суток, не до конца понял для чего это(

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

      далее будут примеры

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

      @@selfedu_rus вопрос конечно не по теме , не подскажете , как сделать запрос Django ORM используя ForiegnKey в обратную сторону. Допустим есть модели к ним марки, сделать выборку по моделям и попутно зацепить марки в одном запросе ?

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

      Если много зависимостей , то prefetch_related, если одна select_related может кому пригодиться ))

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

      @@donfedor007 prefetch_related для many to many, select_related для many to one

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

      @@MrArtlex так то я ответил уже))))

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

    Я не заметил, что поменяется, если декоратор staticmethod просто не писать. Просто написать метод, который не имеет параметра self или cls.

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

      из staticmethod нельзя обратиться к локальный атрибутам объекта, т.к. на объект просто нет ссылки

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

      @@selfedu_rus ну это некоторое ограничение на функционал. Но я уже понял, что оба этих декоратора по сути меняют то как метод воспринимает первый аргумент, и не важно как этот аргумент называется. Раньше я думал, что self и cls это ключевые слова. А оказывается что первый аргумент это всегда по умолчанию ссылка на экземпляр (за исключением метода ___new___ и мб еще каких-то магических). Спасибо за ответ и за плейлист)

  • @user-lj1to7le9w
    @user-lj1to7le9w Год назад +4

    В этом и других видео не хватает хотя бы абстрактного объяснения для чего это нужно. Можем так, а можем вот так, или вот так...
    Меня в первую очередь интересует в каких случаях или для каких целей необходим тот же classmethod, а затем как его реализовывать. Это похоже на обучение вождению, где тебе говорят что есть различные дорожные знаки, но не объясняют для чего они предназначены.

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

      В двух словах, если при реализации логики внутри класса требуется работать только с атрибутами класса, то для этого используется classmethod. Если и атрибуты класса и атрибуты экземпляра класса, то обычные методы. Ну а конкретные практические задачи в курсе на Stepik. Welcome! )

    • @user-lj1to7le9w
      @user-lj1to7le9w Год назад +1

      @@selfedu_rus с этим я уже разобрался вроде бы. Понимания все равно маловато, но полагаю в будущем все станет на свои места. Курс как раз прохожу. Просто чувствуется подход преподавателя, который привык к живому преподаванию. На уроке в аудитории один -два вопроса закрыли мое недопонимание. А так приходится искать объяснения самостоятельно, без гарантии, что пойму я в итоге все правильно.

  • @user-yb2rm6rb7i
    @user-yb2rm6rb7i Год назад +1

    Что за редактор используется?

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

      Camtasia Studio

    • @user-yb2rm6rb7i
      @user-yb2rm6rb7i Год назад

      @@selfedu_rus tnx)

    • @user-yb2rm6rb7i
      @user-yb2rm6rb7i Год назад

      @@selfedu_rus оу, я не точно задал вопрос, я имел ввиду - "редактор кода")

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

      @@user-yb2rm6rb7i PyCharm

  • @user-vm7zy7tw1j
    @user-vm7zy7tw1j Год назад

    Не совсем понял смысл этих методов. Ведь я могу вызвать для объекта, а не класса метод validate()
    v.validate(5). И в чем весь цимус?

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

      здесь смысл, что вы можете вызывать метод validate непосредственно через класс:
      Vector.validate(5)
      а то что можно и из объекта:
      v.validate(5)
      никто не запрещает

    • @user-vm7zy7tw1j
      @user-vm7zy7tw1j Год назад

      @@selfedu_rus спасибо за ответ. Я понял что могу, просто пока сейчас на том уровне знания языка, что еще не понимаю зачем. То есть где это применимо.

  • @rahoti5765
    @rahoti5765 Месяц назад

    Было не понятно, для чего вообще нужен декоратор, ведь по идее и без него бы всё хорошо работало, поэтому сам поигрался в VScode и вот что мы имеем:
    1) Self и cls обычные переменные и могут быть названны как вам удобно, даже если сама среда разработки вам их автоматически ставит, вы можете их переименовать. Просто это общепринятые наименования.
    2) Следуя из первого у нас получается, что если убрать декоратор classmethod, то cls превращается в условный self, которому нужна ссылка на экземпляр класса, иначе выдаёт ошибку о нехватке аргументов, если вызывается через сам класс.
    3)Если декоратор стоит, при этом если вызывать метод класса через экземпляр класса, то всё работает так же прекрасно если и вызывать через сам класс. Но при этом, если в экземпляре класса переопределены поля, например: max_coord и min_coord, то ничего не изменется, так как cls при наличии декоратора неявно принимает аргументом ссылку на класс, от которого произошёл экземпляр, следовательно и использует его значения.
    как итог, получаем, что декоратор меняет логику неявного присваивания значений первым аргументам(self или cls)

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

    А зачем нужны эти декораторы? Если их убрать все продолжает работать.

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

      Вам подробно об этом расскажет сообщество телеграм-канала (ссылка под видео)

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

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

  • @user-xh7fl9hd2c
    @user-xh7fl9hd2c Год назад +1

    так зачем писать @classmethod @staticmethod если их убрать, то программа будет работать также.

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

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

  • @user-vl5gu8xy4o
    @user-vl5gu8xy4o 2 месяца назад +1

    просто лучший 👍👍👍

  • @pal181
    @pal181 2 года назад +5

    А зачем тут декораторы? или без них это не работает?

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

      работает, я проверил)

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

    Ойойой, то ли я тупой,но никак не могу это ООП понять. Уже много раз пересмотрел все видосы, ну никак!!!!

    • @mantrida
      @mantrida 2 года назад +6

      Вам нужно осознать, что в Пайтоне всё объект. Функция, класс, экземпляр класса, метод - всё это объекты. А имена (переменные) только ссылаются на эти объекты. И рассматривать всё в терминах создания в памяти объектов и ссылок на эти объекты. Если понимать что где когда создаётся и что на что ссылается, то ООП начинает казаться логичным )))
      Если вы не можете ответить на вопросы (см. ниже), то скорей всего ООП дальше будет трудно понимать )
      1. Когда создаётся объект класса (не экземпляр класса, а именно объект самого класса) ?
      2. Как происходит создание объекта экземпляра класса (это когда мы пишем pt = Point()) ?
      3. Когда происходит создание объекта метода класса (то есть как функция внутри класса превращается в метод) ?
      4. Что происходит при вызове метода класса ?
      5. def foo(self): - что здесь такое self ?

    • @proxxxy01
      @proxxxy01 2 года назад +6

      Женя хорошо все описал, так что советую погуглить ответы на вопросы, если сам не знаешь.
      Но я попробую объяснить немного проще.
      По сути класс - это некий шаблон\комплектовщик методов для объекта.
      Например, нам надо создать машину(как объект) и дать возможность настраивать параметры для нее.
      Для этого можно создать класс, в котором можно, например, менять цвет и размер определенной машины, просто вызвав метод класса этой машины.
      т.е.
      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}")
      Как видишь - это два совершенно разных экземпляра, имеющие одинаковые методы, которые позволяют в разы проще, быстрее и лаконичнее менять их "личные" данные.

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

      @@proxxxy01 Спасибо, теперь более понятно.

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

      @@mantrida Пожалуй отвечу на ваши вопросы, если что не так пожалуйста поправьте. 1) Объект класса создается при его инициализации 2) Создание экземпляра - это то что вы указали в скобках. 3) Создание метода класса происходит при объявлении класса (при создании класса создаются его атрибуты, а функция, являющаяся атрибутом класса, является методом) 4) При вызове метода класса выводится возможность метода обращаться к экземпляру класса 5) Это параметр, который ссылается на экземпляр класса

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

      @@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) Это параметр, который ссылается на экземпляр класса
      А где вы видите класс ?: ))

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

    Слишком быстро объясняешь для новичка, но в целом ок

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

    сколько ни читал про эти декораторы, всё равно не понимаю, на кой это надо

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

      см. курс по Flask или Django, они там на каждом шагу ))

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

    Сижу и дкмаю - кто поставил ети дисслайки ..

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

    Ничего не понятно… надо пересматривать до тошнотиков

  • @user-jw5yw3ch7q
    @user-jw5yw3ch7q Год назад +1

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

  • @user-qe7dr1zp2x
    @user-qe7dr1zp2x 6 месяцев назад +1

    Я уже подумал что это у меня динамики дребезжат так противно, одел наушники такой же звук)

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

    Посмотрела аналогичное видео у Никиты Хохлова. Краткость сестра таланта. У вас все очень размыто, слишком много информации, конкретики мало.

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

    Не очень понятно объясняете, слишком быстро, примеры невнятные, очень жаль

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

    Говор у тебя , как будто я передачу смотрю в мире животных

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

    Я, кстати, заметил, что функции (подобно свойствам) можно использовать не только в качестве атрибута класса, но и в качестве локального атрибута экземпляра класса. Это как-то используется?