#7. Магические методы __setattr__, __getattribute__, __getattr__ и __delattr__ | ООП Python

Поділитися
Вставка
  • Опубліковано 2 січ 2025

КОМЕНТАРІ • 190

  • @Watcherfromfar
    @Watcherfromfar 11 місяців тому +30

    Объяснение "Зачем" - это ключевой момент, как мне кажется. Без этого все эти методы просто набор команд, которые выветрятся из памяти без применения. А понимая зачем, больше шансов, что они вспомнятся в нужный момент)))

  • @n0rmaLman
    @n0rmaLman 3 роки тому +64

    Особая благодарность за разъяснения "зачем".

  • @antonvorobiev9507
    @antonvorobiev9507 3 роки тому +45

    СПАСИБО Вам за Ваш труд! Ваши лекции лучшие из тех, что встречаются на просторах Ютуба.

  • @requiem4soul
    @requiem4soul 6 місяців тому +6

    10:05 - мы все не хотели, но он появился... Спасибо огромное даже за такое высказывание скрытое, уже теплее на душе стало

    • @PavelNebo
      @PavelNebo 21 день тому +1

      ага, только видео то было залито 26 нояб. 2021 г.

    • @НиязРустемов-р3ц
      @НиязРустемов-р3ц 6 днів тому

      Наверное воспользовались:
      object.__settattr__(pt1, 'z', 5)
      Которое смогло обойти ограничение в переопределенном магическом методе.

  • @ВикторПелих-я6ш
    @ВикторПелих-я6ш Рік тому +21

    Ролик всего лишь чуть более пятнадцати минут, а чтобы утоптать его в голову, понадобился без малого целый день. И то степень усвоения материала - иллюзия понимания. Автору очередное большое спасибо.

    • @fatimaal-tavill6048
      @fatimaal-tavill6048 Рік тому +5

      Как же точно вы описали мое состояние. А я все понять не мог, что именно не так.

    • @antondopira5957
      @antondopira5957 Рік тому +6

      сидишь и пробуешь написать ручками, а потом что-то ради интереса поменять, чаще всего, когда непонятно "а как это повлияет на результат и сойдется ли с моим ожидаемый". У меня на каждую тему благодаря такому методу 30-40 мин уходит

  • @kapwas
    @kapwas 2 роки тому +64

    Запрет z спустя 5 месяцев приобретает свой смысл, лайк за видео, как всегда.

    • @GetEnjoyChannel
      @GetEnjoyChannel 2 роки тому

      Отличный способ запретить Z использовав setattr. Пример как всегда актуальный

    • @sense3247
      @sense3247 2 роки тому +1

      Осталось удалить из английского алфавита

    • @xximde
      @xximde Рік тому +4

      Везде надо приплести политику, клоун

    • @takumi_senju
      @takumi_senju Рік тому +5

      @@xximdeПолитика везде, от неё не куда не спрятаться.
      Как говорил великий Немчинский, если ты не интересуешься политикой то ты не зрелый человек, вот такие пироги🤷🏻‍♂️

  • @tisseract
    @tisseract 2 роки тому +10

    Спасибо за лёгкую и приятную подачу сухого материала! Ваше речевые обороты искренне радуют - "будем полагать, что мы теперь хорошо понимаем" - :)

  • @alexsidikov3426
    @alexsidikov3426 Рік тому +4

    Огромное спасибо! Всегда любил учиться по системе "Если тема не понятна, меняй спикеров/учителей" и на вашем примере сработало, вы первый кто сказал что-то , что не говорили остальные и все встало на свое место :) 4:25 сижу такой и бамс, все понял , спасибо!🤩

  • @alexanderg9089
    @alexanderg9089 2 роки тому +13

    Сергей, жму Вам руку! Отличный материал! Смотрю как уменьшается количество просмотров и лайков от урока к уроку, все таки курс ориентирован не на новичков. Но для тех кто знаком с ООП ваш материал просто клад!

  • @Cygni7
    @Cygni7 Рік тому +4

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

  • @ifan6204
    @ifan6204 Рік тому +2

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

  • @sergeisemenov6087
    @sergeisemenov6087 Рік тому +2

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

  • @jaksonmillka
    @jaksonmillka 3 місяці тому +1

    Урок #7 = Пройден
    Было интересно узнать о существовании этих методов, и что их можно переопределять. Вряд ли конечно, что они будут на постоянной основе использоваться на практике, но все же, сам факт того, что их тоже можно контролировать, радует :)
    Спасибо за урок. Эти 3 часа, прошли достаточно быстро. Думаю, сегодня уже закончу, и вернусь завтра.

  • @agniusl
    @agniusl Рік тому +2

    Молодец программист, начал хоть что то понимать в ООП

  • @РомаГамин
    @РомаГамин 2 роки тому +2

    Сергей, доброго времени суток. Вас беспокоит Бог. За ваш бескорыстный труд я приготовил вам место в раю. Увидимся не скоро: я вам нормально так жизню продлил. Спасибо вам и всего светлого!

  • @ИванПеньшин
    @ИванПеньшин 3 роки тому +6

    Большое спасибо Вам за такие уроки!

  • @pphan_
    @pphan_ 11 місяців тому +3

    __ЧЕКПОИНТ__
    Смотрю видео уроки уже 7 день подряд пытаясь изучить ооп и у меня отлично получается! Спасибо огромное Сергею,за предоставленные знания,а я прошу пожелать мне удачи в понимании следующих тем)

    • @kalivann
      @kalivann 6 місяців тому

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

    • @pphan_
      @pphan_ 6 місяців тому +2

      @@kalivann досмотрел курс по ооп,написал парочку проектов и забил, собираюсь изучить c# и попробовать сделать чит для игры

  • @sofiipochta
    @sofiipochta 4 місяці тому +2

    Спасибо, посмотрела!!!

  • @anvarx1
    @anvarx1 2 роки тому +2

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

  • @johnysh6480
    @johnysh6480 Рік тому +1

    Спасибо за классные уроки! И мне сердечко!)

  • @aidartimerbayev9600
    @aidartimerbayev9600 3 роки тому +4

    Спасибо! Очень четкое объяснение магических методов.

  • @andredru4278
    @andredru4278 10 місяців тому +1

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

  • @donfedor007
    @donfedor007 3 роки тому +5

    Интересное занятие! Можно добавлять гибкость в свой код, этими методами!

  • @Маньякич-т4г
    @Маньякич-т4г 2 роки тому +39

    10:06 Мы бы не хотели что бы создавался атрибут с именем Зет("z") :)

    • @СтепСтеп-п1л
      @СтепСтеп-п1л Рік тому +1

      ахахаха

    • @zetmixbeatz
      @zetmixbeatz Рік тому

      Обидно

    • @PavelNebo
      @PavelNebo Рік тому

      хахах, я тож заметил.. потом глянул дату выхода видео - 26 нояб. 2021 г. Он что-то знал ?)))

    • @spraysferry9841
      @spraysferry9841 Рік тому +3

      @@zetmixbeatz почему обидно? Єто знак нацистов и ужасних людей.

    • @zetmixbeatz
      @zetmixbeatz Рік тому

      @@spraysferry9841 на мой ник взгляни

  • @artyomklimov3447
    @artyomklimov3447 2 роки тому +4

    Блин, ютуб, для таких видео давно должна быть функция "поставить тыщу лайков" !!!!

  • @rizef2166
    @rizef2166 Рік тому +2

    Может кому - то так станет понятно если он не понял. Немного забегу вперед, поскольку я сначала проходил менее подробный курс и там было про наследование, то я лично смог это понять относительно легко именно поэтому, как мне кажется. Когда мы наследуем любой класс в другой класс, мы это делаем по средствам скобок после названия класса и прописываем внутри название класса от которого наследуем, в случае с классом object мы неявно наследуем его по умолчанию, как тут и сказано собственно. Мы наследуем все атрибуты класса, кроме понятно защищенных от этого. И в данном случае хоть мы и не видим все эти атрибуты в теле класса, мы всеровно можем к ним обращаться, а когда мы прописываем метод внутри дочернего класса с названием которое уже существует в материнском классе, то мы выполняем так называемое переопределение атрибута, то есть теперь у нас есть атрибут с таким же названием как в материнском классе, но выполняет он теперь при вывозе тот функционал который мы прописали. А таким синтаксисом: название_материнского_класса.название_материнского_атрибута(необходимые аргументы) мы как раз возвращаем весь тот функционал что содержится внутри материнского метода с таким же названием. Как я понимаю переопределение метода класса происходит по такому же принципу как создание атрибута для экземпляра класса, то есть когда мы создаем атрибут с таким же названием внутри класса, то python сразу находит нужный нам атрибут внутри дочернего класса и поэтому не начинает искать в материнском классе на который ссылается этот самый дочерний

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov Рік тому +1

    Сергей, благодарю!! 👍🔥💯

  • @mslq
    @mslq Рік тому +1

    Этот урок слушал 5 раз.

  • @fWhyJKE
    @fWhyJKE Рік тому +1

    С первого раза туго пошло, второй раз пересмотрел через пару часов и всё понял. Если что-то не понятно, советую такой подход.

  • @Bisirsky
    @Bisirsky 3 роки тому +2

    Спасибо за урок! Не знал и использовал костыли :)

  • @ЯрославБеляев-т5к
    @ЯрославБеляев-т5к 3 роки тому +2

    Вау! Спасибо большое!
    Это многое упрощает😅

  • @random_act
    @random_act Рік тому

    необычной понятности примеры

  • @ЕрвандАгаджанян-в3к

    Супергениальный урок!!!

  • @egorkomarov4719
    @egorkomarov4719 2 роки тому +1

    Лучший! Спасибо

  • @Programming_is_my_life
    @Programming_is_my_life Рік тому

    Дуже круто мені понравилось.

  • @Zavintyshka
    @Zavintyshka 2 роки тому +3

    Спасибо Сергею за бан атрибута, с названием Z

  • @Олег-л5ю2п
    @Олег-л5ю2п 2 роки тому +1

    Невероятно крут

  • @vitaliyvorona9990
    @vitaliyvorona9990 10 місяців тому +1

    @selfedu_rus - its genius 🎉
    Вы настолько тонко подметили про "z" attribute, что я тут же пришел в сообщения Вам написать, насколько Вы правы и заметил, что я не один такой 😉
    Спасибо, очень интересные, компактные и емкие лекции. 👍🏻

    • @babanlive
      @babanlive 10 місяців тому +1

      думаю все поняли о чем шла речь.

  • @Keshtiman
    @Keshtiman 2 роки тому +5

    Очень интересные и познавательные уроки, спасибо вам!
    Только мне кажется, что перед подачей данного материала было бы хорошо людям обьяснить про наследование от object, потому что без понимание этого, тяжело понять материал в этом уроке, что и почему делается.
    Спасибо

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      Спасибо! Про object будет дальше в теме наследование

    • @defoliant
      @defoliant Рік тому +1

      @@selfedu_rus на данном этапе можно было использовать super() как в прошлом уроке? или так не сработало бы?

  • @kotovasya87
    @kotovasya87 2 роки тому +2

    Благодарю за урок.
    Хорошее разъяснение присваивания с self на 2:50.
    По примеру метода __setattr__: если удалить строку с "object ...", то в результате выполнения кода всё равно метод вызывается 4 раза. Для чего тогда строка "object ..."?

    • @hesha-n9b
      @hesha-n9b 2 роки тому +2

      Строка с "object.__setattr__" обеспечивает непосредственно работоспособность метода. А то, что наблюдается вызов 4 раза, это всего лишь отрабатывает print() внутри этого метода, то есть метод был вызван, но без строки с "object" он никакой работы не выполнил. И чтобы убедиться в этом достаточно вывести все атрибуты после инициализации через pt1.__dict__, например. И попробовать это сделать со строкой "object.__setattr__" и без неё.

  • @Влад-у8к9з
    @Влад-у8к9з 5 місяців тому +2

    Здравствуйте, в примере использования метода __getattribute__ можно ли просто сделать этот атрибут приватным как на предыдущим уроке где рассказывалось о режимах доступа? Или это будем совсем другое

  • @andreistasevich9894
    @andreistasevich9894 2 роки тому +22

    Мы бы не хотели, чтобы появлялся атрибут "z". Внезапно)

    • @selfedu_rus
      @selfedu_rus  2 роки тому +2

      и случайно ))

    • @BeginBye
      @BeginBye 2 роки тому

      Тоже вот хотел такое же написать, а оно раз - и есть уже))

  • @PrimaLuceAstronaut
    @PrimaLuceAstronaut 3 роки тому +2

    С одной стороны, хорошо, что наконец появились видео по этой теме, но с другой стороны как-то обидно, что буквально месяц назад, для одной задачки с кодворс я сам около недели искал информацию по метапрлграммированию и магическим методам, сам разбирался в найденном, при том половина была на английском, а здесь про магические методы рассказывается буквально за пару видео и при этом понятно и информативно
    Появляется ощущение, что старания были напрасны(

  • @aleksandrsemenov1764
    @aleksandrsemenov1764 2 роки тому +1

    Спасибо за урок

  • @jamjam3337
    @jamjam3337 Рік тому +1

    спасибо!👏👍

  • @uniqqquniqqq2053
    @uniqqquniqqq2053 2 роки тому +3

    Возможно вам стоит оставлять номер или ссылки для донатов под видео. Настолько понравились видео, что я бы вам задонатил небольшую сумму. И наверно еще такие люди найдутся :)

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      спасибо, просто сейчас многие такие сервисы отсеялись, поэтому кроме yoomoney кошелька нечего указывать...

  • @Hodakovi
    @Hodakovi Місяць тому +1

    Не могу понять, почему для получения значения атрибута под return необходимо обращаться через object да еще и атрибуты такие же в скобках ставить, как и в самом методе?

  • @ЭЛьПадре-з1д
    @ЭЛьПадре-з1д 2 роки тому +1

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

  • @СергейГузун-л6с
    @СергейГузун-л6с Рік тому +1

    Спасибо

  • @vs_gaming3013
    @vs_gaming3013 2 роки тому +3

    Благодарю за столь понятное пояснение! Подскажите, в чем разница между Super и object? Когда мы используем метод __new__, мы обращаемся к Super(), а здесь же для __delattr__ (и всех остальных в этом видео) - используем object. Мы ведь и для __new__ тоже можем использовать object?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +7

      Спасибо! Разница в том, что super() позволяет обращаться непосредственно к базовому классу (а иерархия наследования может быть самой разной), а через object мы обращаемся к самой вершине иерархии.

    • @vs_gaming3013
      @vs_gaming3013 2 роки тому +2

      @@selfedu_rus
      Огромное спасибо!

  • @ДмитрийСафронов-р2ъ

    Можно вопрос тем кто шарит? когда мы переопределяем метод __getattribute__ мы указали object как базовый класс и передали self и item ( object.__getattribute__(self, item) ). Но насколько я понял мы можем также указать вместо object super(). Но когда используешь super() то нужно передавать только item. ( super().__getattribute__(item)). Почему такая разница если мы в и том и в другом случае ссылаемся на родительский класс object ???

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      очень просто, object - это сам базовый класс, а super() - это объект базового класса, поэтому первый параметр self передается автоматически.

    • @ДмитрийСафронов-р2ъ
      @ДмитрийСафронов-р2ъ Рік тому

      @@selfedu_rusСпасибо за ответ! Правильно ли я понимаю, что использования super() как ссылку на базовый класс для переопределение методов не будет ошибкой? или же правильнее указывать сам базовый класс?

    • @selfedu_rus
      @selfedu_rus  Рік тому

      @@ДмитрийСафронов-р2ълучше super()

    • @ДмитрийСафронов-р2ъ
      @ДмитрийСафронов-р2ъ Рік тому

      @@selfedu_rus Спасибо за объяснения!

  • @vladsnisar2207
    @vladsnisar2207 2 роки тому +6

    почему при создании экземпляра класса через __new__ мы вызываем super(), а при использовании этих магических методов просто обращаемся к нему как object?
    Edit: super() возвращает ссылку на object, а когда пишем object, то напрямую обращаемся? Тогда есть ли разница в этих способах доступа к базовому классу?

    • @beribanyu
      @beribanyu 2 роки тому

      Поддерживаю вопрос, тоже интересно

    • @SerhiyLytvynenko
      @SerhiyLytvynenko 2 роки тому

      @@beribanyu Как понял я: Если мы используем object, то при return нам нужно указать первым параметром self, а при использовании super это делается автоматически. То есть ,по сути, одно и тоже

  • @Romkaz92
    @Romkaz92 9 місяців тому +1

    Выглядит так, что на посленем слайде, где написано __setattr__(self, key, value)__ - автоматически вызывается при изменении
    свойства кеу класса;
    два нижних подчеркивания после (self, key, value) лишние. Верно ли это замечание? Или они там нужны?

  • @ussenUtebayev
    @ussenUtebayev Рік тому +1

    Я так понимаю мы "якобы" меняем поведение магического метода но просто вызывая это у object можно сказать что мы засовываем промежуточные команды.

  • @xandrviking1113
    @xandrviking1113 6 місяців тому +1

    Спасибо за уроки 🖖👍

  • @gayratsaidakhmedov5451
    @gayratsaidakhmedov5451 11 місяців тому +1

    спасибо

  • @noookm
    @noookm 2 роки тому +1

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

  • @osvab000
    @osvab000 3 роки тому +1

    Первый, как всегда лайк.

  • @blanky_nap
    @blanky_nap Рік тому

    А какая разница между этими магическими методами и дискрипторами?

  • @ablivion4457
    @ablivion4457 Рік тому +1

    Здравствуйте! Я так понимаю return object.__getattribute__(self, item) и return super().__getattribute__(item) это аналогичные записи?

  • @DuhaxD
    @DuhaxD 3 роки тому

    8:32
    А почему работа с атрибутами private типа не работает примерно так? ( Для примера представим, что у нас в классе
    есть два приватных атрибута __x, __y)
    Так ведь не выйдет получить доступ, обращаясь к полям
    таким образом ._
    def __getattribute__(self, item):
    if item in ("_Point__x", "_Point__y"):
    raise ValueError(f"There no access to item: {item}")
    else:
    return object.__getattribute__(self, item)

    • @selfedu_rus
      @selfedu_rus  3 роки тому +1

      Если вы хотите совсем жестко запретить доступ, то как вариант, но на практике достаточно просто пометить атрибуты как private или protected, чтобы программист знал, что к ним не следует обращаться. Ну а если он нарушит это правило, то работоспособность программы на его совести. Профессионалы так не делают.

    • @DuhaxD
      @DuhaxD 3 роки тому

      @@selfedu_rus Понял, спасибо.

  • @hesha-n9b
    @hesha-n9b 2 роки тому

    На 6:41 есть ли разница между object.__getattribute__(self, item) и super().__getattribute__(item) ?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      Нет, разницы не будет

    • @hesha-n9b
      @hesha-n9b 2 роки тому

      @@selfedu_rus почему тогда при использовании super().__delattr__(item) возникла ошибка, а при object.__delattr__(self, item) нет?

    • @selfedu_rus
      @selfedu_rus  2 роки тому +2

      @@hesha-n9b Если у вас имеется иерархия наследования, то родительский уже будет не object, т.е. функция-объект super() возвратит другой класс и из-за этого возможны ошибки. Поэтому здесь лучше обращаться через object.

  • @МамонтовОлег-в9о
    @МамонтовОлег-в9о 3 роки тому +5

    понемногу становлюсь магом

    • @mammonth
      @mammonth 2 роки тому +2

      привет

  • @PrimaLuceAstronaut
    @PrimaLuceAstronaut 3 роки тому +2

    Кстати, ещё вопрос на уточнение. Я правильно понимаю, все классы, которые не наследуются от созданных нами, наследуются от object, у которого метакласс это type?

    • @selfedu_rus
      @selfedu_rus  3 роки тому +2

      да, в версии Python3 все классы неявно наследуются от object, если не прописаны какие-либо другие базовые классы и также у всех классов по умолчанию идет метакласс type.

  • @mrrototo761
    @mrrototo761 11 місяців тому +1

    Теперь понятно где можно использовать @classmethod 😅

  • @xut4mah
    @xut4mah Рік тому +1

    а можно ли в данном примере с __getattribute__ обращаться к родительскому классу через super().__getattribute__() и если да, то в чём будет отличие от обращения через object.__getattribute__()

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      При множественном наследовании super() дает непосредственно текущий базовый класс, а не самый базовый object. Во всем остальном без разницы. Метод __getattribute__() можно и так и так вызывать.

  • @vikeykava
    @vikeykava Рік тому +1

    10:05 актуальненько))

  • @marat_shaydulin
    @marat_shaydulin Рік тому +1

    Интрересно, что с методом __getattribute__ такой же фокус, как с __setattr__ не прокатывает и:
    def __getattribute__(self, item):
    print("here is the value:")
    return self.__dict__[item]
    вызывается рекурсивно. Почему так?

    • @Cygni7
      @Cygni7 Рік тому +1

      Думаю потому,что __dict__ тоже является атрибутом self. И self.__dict__ [item] по сути является вызовом (получением) атрибута этого экземпляра, что вызывает рекурсию. Но лучше подождать объяснения от автора))

    • @Cygni7
      @Cygni7 Рік тому +1

      А при использовании __setattr__ хоть мы и изменяем содержимое атрибута __dict__,но не делаем это напрямую, например self.__dict__ = что то, а меняем один из его элементов (некоторый атрибут self'а), и это не считается за изменение атрибута, поэтому рекурсии нет. Опять же, автор лучше знает, я высказал что думаю)

  • @kra1dexnetwork
    @kra1dexnetwork 2 роки тому +1

    возможно туповатый вопрос, но зачем создавать атрибут, чтобы потом запретить обращаться к нему? 8:20

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

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

  • @impellergimpeller5133
    @impellergimpeller5133 3 роки тому +1

    👍👍👍👍👍

  • @antahix
    @antahix 3 роки тому +3

    Такой вопрос, это нужно больше для понимания или же применяется на практике?
    урок как всегда супер, все понял, спасибо вам))

    • @selfedu_rus
      @selfedu_rus  3 роки тому +4

      Спасибо! На практике это все используется, лучше знать, лишнее я стараюсь не давать.

  • @The_Establishment
    @The_Establishment 11 місяців тому +1

    Станут ли задания по ООП на степике когда-нибудь бесплатными ?)

  • @orthodox-chanel
    @orthodox-chanel Рік тому +1

    как часто эти атрибуты используются в реальной работе?

    • @prto4kin359
      @prto4kin359 Рік тому

      Достаточно часто, что бы знать как пользоваться

  • @reversika7272
    @reversika7272 10 місяців тому +1

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

    • @selfedu_rus
      @selfedu_rus  10 місяців тому

      Только что отвечал на это в ТГ-канале. Подписывайтесь на него.
      Приоритет вызова дескриптора выше, чем у обычной переменной, поэтому конструкция self.name=name вызывает дескриптор по рекурсии

    • @Majohne
      @Majohne 10 місяців тому +1

      |__setattr__| вызывается всякий раз при присвоении. Если в нем присвоить значение, то он опять вызовется, опять присвоится, опять вызовется и вот рекурсия

    • @reversika7272
      @reversika7272 10 місяців тому +1

      @@Majohne спасибо Вам большое! Теперь я поняла😊

    • @reversika7272
      @reversika7272 10 місяців тому

      @@selfedu_rus спасибо большое Вам!😊

  • @1010Bogdan
    @1010Bogdan 2 роки тому

    Спасибо за ролик! Подскажите, пожалуйста. В примере с помощью переопределения ___getattribute___ вы сделали так, чтобы не было возможности обращаться к атрибуту "x". Правильно понимаю, что на практике правильнее будет сделать переменную "x" приватной, а не использовать переопределение __getattribute__?
    И ещё у меня в PyCharm ___getattribute___ вызывается даже если просто написать Point(), то есть, необязательно присваивать переменную для вызова ___getattribute___, это, наверное, потому что у меня более новая версия Python?

  • @Учусь-л7ц
    @Учусь-л7ц Рік тому +1

    Почему при вызове магических методов __new__() мы обращались к классу super(), а при вызове этих магических методов обращаемся к классу object

    • @selfedu_rus
      @selfedu_rus  Рік тому

      object - это самый базовый класс, а super() возвращает первый базовый класс (на данном уровне object и super() работают одинаково)

    • @Учусь-л7ц
      @Учусь-л7ц Рік тому

      @@selfedu_rus спасибо

  • @duke007x3
    @duke007x3 2 роки тому +101

    Мы бы не хотели, чтобы появлялся атрибут с именем 'Z'. Очень актуально

    • @selfedu_rus
      @selfedu_rus  2 роки тому +12

      😁

    • @podgorniy.r
      @podgorniy.r 2 роки тому +8

      вуду-программист)

    • @PavelNebo
      @PavelNebo Рік тому +2

      Если бы в реальной жизни можно было просто взять и написать эксепшен)))

    • @vilag_programmer
      @vilag_programmer Рік тому +8

      С хрена ли? Этому атрибуту везде дорога.

    • @YouTubeqtew
      @YouTubeqtew Рік тому +4

      @@vilag_programmer Нет

  • @ВячеславТарасов-и4с

    Поправьте меня если я не прав, но во второй части напутано, пом меньшей мере в терминологии... 5.25 - здесь в определениях говорится о "свойствах класса", когда в реальности рассказывается об instance variables, а не о class variables, как можно подумать, и как подумает любой, ведь в первой части рассказывалось именно о class variables.

    • @selfedu_rus
      @selfedu_rus  Рік тому

      Магические методы __setattr__, __getattribute__, __getattr__ и __delattr__ служат для обработки локальных атрибутов экземпляров классов

  • @rahoti5765
    @rahoti5765 9 місяців тому +1

    зачем существует и object и super()? При чём __new__ работает через оба вызова, а __getattribute___ только через вызов object?
    похоже что super ссылается просто на родителя, а object к object - самому верхнему классу

    • @selfedu_rus
      @selfedu_rus  9 місяців тому

      Это простые вопросы в ТГ-канал по Python. Сообщество ответит.

    • @imadna5810
      @imadna5810 8 місяців тому

      сам ответил на свой вопрос )

  • @ibrahimoglu
    @ibrahimoglu 3 роки тому +2

    👍

  • @skyTechVektor
    @skyTechVektor 6 місяців тому +1

    А вместо object можно написать super?

  • @dmitriygribkov1272
    @dmitriygribkov1272 2 роки тому

    Почему удаление не происходило при записи del pt1.x ,
    а только потом, когда дописали метод
    def __delattr__ (self, item):
    object.__delattr__(self,item)
    ?
    Ведь по сути этот метод нужен для создания доп действий при удалении какого-то атрибута.
    Либо же object.__delattr__(self,item) как раз ставит точку в этой операции удаления(del pt1.x)?

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      проверил, все удаляет, что то не так сделали, видимо

    • @hurricanehaze
      @hurricanehaze 2 роки тому

      ​@@selfedu_rus ​ на 14:14 print(pt1.__dict__) вернул {'x':1, 'y':2}. Пользователь скорее всего спрашивает почему из коллекции __dict__ x удалился только после дописания object.__delattr__(self,item) в метод _delattr_.
      Посмотрев ваше видео попробую ответить. Магический метод __delattr__ вызывается при удалении атрибутов экземпляра класса, т.е. происходит только вызов метода. Доп действия вы уже сами придумываете при переопределении магического метода. Так как переопределив мы написали print("__delattr__ :"+item), то при удалении атрибута произойдет только вывод строки. Конкретно логика удаления атрибута происходит в базовом классе object в __delattr__ , именно поэтому необходимо дописать вызов object.__delattr__(self, item) в нашем переопределенном методе __delattr__ класса Point.

  • @ShadowStormlq5mwdasd
    @ShadowStormlq5mwdasd 2 роки тому +1

    Так получается MIN_CORD в случае когда мы не юзаем classmethod для присвоения ему значения - становиться атрибутом экземпляра класса?

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      да, т.к. мы используем ссылку на класс

  • @олегтарасов-э4ф
    @олегтарасов-э4ф Місяць тому

    разработчики питона такие: "значит в __del__ не нужно всяких усложнений делать. он вызывается именно при удалении, за само удаление не отвечает, а __delattr__ - это другое..."

  • @картонобзоры
    @картонобзоры 2 роки тому +1

    А почему вызывается именно object?

    • @prto4kin359
      @prto4kin359 Рік тому

      Все классы в питоне неявно наследуются от object, поэтому и вызывается именно он, т.к. в нем прописаны все эти маг. методы.

  • @NoNoNo_Name
    @NoNoNo_Name 2 роки тому

    Почему в __setattr__ не используется return? Опечатка или его особенность?

    • @brushupyourenglish3455
      @brushupyourenglish3455 2 роки тому

      А зачем Вам что-либо возвращать из этого метода? Вы уже определили новый атрибут через super().__setattr__(...). А если нужно вернуть значение атрибута, то уже непосредственно вызывается метод get

  • @alexeyxopyc2471
    @alexeyxopyc2471 2 роки тому

    спасибо за урок!)
    не совсем понимаю как это работает) похоже на то что эти магические методы при создании класса автоматически добавляются без их определения и работают в каком то "режиме по умолчанию"...а когда уже мы их объявляем - мы их работу немного корректируем по своему усмотрению...
    либо я не понял как мы после определения метода вызываем тот же метод :
    def __getattribute__(self,item):
    return object.__getattribute__(self,item):

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      да, все верно, каждый класс в Python3 наследуется (неявно) от object

    • @alexeyxopyc2471
      @alexeyxopyc2471 2 роки тому +1

      @@selfedu_rus а , ну то есть они все в object уже прописаны)) спасибо!)

  • @Sergey-cz7ym
    @Sergey-cz7ym Рік тому +1

    А почему раньше мы обращались к родительскому классу через super а тут через object? Можно вместо object писать super?

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      object - это самый верхний (базовый) класс, а super() выдает следующий базовый, от которого мы наследовались. Если наследований явных не было, то super() и object ведут на один и тот же класс.

  • @ИгорьПравдин-п3у

    А почему если мы хотим изменить атрибут класса Point, нам просто не написать Point.min_coord = 100 ? вместо целого classmethod ?

    • @selfedu_rus
      @selfedu_rus  Рік тому

      чтобы через экземпляр класса менять атрибут класса

  • @VGCor
    @VGCor 2 роки тому

    Всё же до конца не понятно, почему вместо обращения к словарю с атрибутами лучше использовать object.__setattr__()?

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      метод object.__setattr__() как раз и делает установку атрибутов, поэтому лучше к нему сразу и идти, если прописать super().__setattr__(), то из-за иерархии наследования поиск может идти до object.__setattr__() дольше

    • @VGCor
      @VGCor 2 роки тому

      @@selfedu_rus это понятно, но я немного о другом.
      11:53 почему лучше всего использовать object.__setattr__(self, key, value) вместо self.__dict__[key] = value?
      У меня конструкция такая:
      for attr in attrs:
      self.__dict__[attr].__dict__["new_attr"] = "Default value"
      И как в этой конструкции применить __setattr__ не понимаю.

    • @selfedu_rus
      @selfedu_rus  2 роки тому

      @@VGCor я бы использовал .__setattr__() вместо прямого обращения к __dict__, хотя иногда приходится работать напрямую со словарем (чтобы избежать рекурсии вызовов __setattr__())

  • @x-user-agent
    @x-user-agent 3 роки тому +4

    а почему вызов через object. а не через super()?

    • @x-user-agent
      @x-user-agent 3 роки тому +15

      сам и отвечу) погуглил - и так и так можно)

    • @prto4kin359
      @prto4kin359 Рік тому +1

      @@x-user-agent Но только если ваш класс не наследуется от другого

  • @sergioramos4562
    @sergioramos4562 2 роки тому

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

    • @prto4kin359
      @prto4kin359 Рік тому

      4 месяца, работать з данными и парсингом

  • @Eazy1art
    @Eazy1art 2 роки тому +2

    Я запутался, понятия "атрибут класса" и "свойство класса" - это синонимы

    • @selfedu_rus
      @selfedu_rus  2 роки тому +1

      в общем, да, но чаще СВОЙСТВА я отношу к переменным, а АТРИБУТЫ - ко всем элементам класса (методам, переменным и т.п.)

    • @Eazy1art
      @Eazy1art 2 роки тому

      @@selfedu_rus Хорошо, спасибо

  • @МихаилПашенин
    @МихаилПашенин Місяць тому +1

    запрет на букву z:)

  • @public_sensei
    @public_sensei Рік тому +3

    В Украине уже как полтора года запрещены атрибуты Z😁

  • @Wot-blitz-ua-v8i
    @Wot-blitz-ua-v8i 3 роки тому

    Есть тут люди которые проходят и главное понимают все что он снимает ? Как вы это будете применять на практике и ТД

    • @qemist7570
      @qemist7570 3 роки тому +3

      В вакууме, понятное дело, все это лютейшая абстракция. Но если потыкаться самому, сделать хотя бы простенький проект с применением этих штук - очень быстро доходит, как по мне. Ну и еще имеет смысл держать в голове, что ООП раскрывает себя на реально огромных проектах, где находят применение методы из этого видоса, например. Если интерес есть, можешь посмотреть какие-нибудь опенсорс проекты, чтобы увидеть реализацию на практике
      И честно, на этом канале обычно самая понятная подача материала, как минимум для меня, из всего, что я смотрел/читал, в том числе и по ООП
      Вообще, если прям докапываться, хотелось бы побольше отсылок на примеры из реальных задач, где все это применяется и реализацию, но это такое

    • @selfedu_rus
      @selfedu_rus  3 роки тому +3

      Посмотрите фреймворк Django (на этом канале) и увидите, что он без ООП просто немыслим )

    • @KonstantinYurievich
      @KonstantinYurievich 3 роки тому +2

      Понятно практически все, что Сергей объясняет, но лично я, веду конспект всего материала, иначе информация не удерживается в голове, по крайней мере, у меня. И обязательно закрепляю практикой большую часть материала. Конечно, если просто смотреть, как киношку, то толку 0.

    • @prto4kin359
      @prto4kin359 Рік тому

      @@KonstantinYurievich Полностью с вами согласен, так же конспектирую в отдельном файле