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

Поделиться
HTML-код
  • Опубликовано: 24 ноя 2021
  • Курс по Python ООП: stepik.org/a/116336
    Класс как пространство имен. Порядок обращения к атрибутам класса и к атрибутам его экземпляров. Магические методы при работе с атрибутами класса: _setattr__, __getattribute__, __getattr_ и _delattr_
    Инфо-сайт: proproprogs.ru/python_oop
    Telegram-канал: t.me/python_selfedu

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

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

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

  • @n0rmaLman
    @n0rmaLman 2 года назад +51

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

  • @antonvorobiev9507
    @antonvorobiev9507 2 года назад +42

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

  • @user-jo5ij6df1d
    @user-jo5ij6df1d Год назад +17

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

    • @fatimaal-tavill6048
      @fatimaal-tavill6048 Год назад +3

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

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

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

  • @pphan_
    @pphan_ 4 месяца назад +3

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

  • @Cygni7
    @Cygni7 9 месяцев назад +4

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

  • @tisseract
    @tisseract Год назад +9

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

  • @alexanderg9089
    @alexanderg9089 2 года назад +10

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

  • @sergeisemenov6087
    @sergeisemenov6087 6 месяцев назад +2

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

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

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

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

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

  • @user-qy5wj2jk1n
    @user-qy5wj2jk1n 2 года назад +6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Спасибо

  • @rizef2166
    @rizef2166 6 месяцев назад +2

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

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

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

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

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

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

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

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

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

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

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

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

    спасибо!👏👍

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

    спасибо

  • @kapwas
    @kapwas 2 года назад +60

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @1010Bogdan
    @1010Bogdan Год назад

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @user-uv1jv8bt5i
    @user-uv1jv8bt5i Год назад +40

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

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

      ахахаха

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

      Обидно

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

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

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

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

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

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

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

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

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

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

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

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

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

    👍👍👍👍👍

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    👍

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

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

  • @andreistasevich9894
    @andreistasevich9894 2 года назад +22

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

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

      и случайно ))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @ablivion4457
    @ablivion4457 5 месяцев назад +1

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

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

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

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

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

    • @user-te3ny1jh3b
      @user-te3ny1jh3b 7 месяцев назад

      @@selfedu_rus спасибо

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

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

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

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

    • @user-mk6yf4lu3p
      @user-mk6yf4lu3p 7 месяцев назад

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

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

      @@user-mk6yf4lu3pлучше super()

    • @user-mk6yf4lu3p
      @user-mk6yf4lu3p 7 месяцев назад

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

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

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

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

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

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

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

  • @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 Год назад

      ​@@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.

  • @marat_shaydulin
    @marat_shaydulin 9 месяцев назад +1

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

    • @Cygni7
      @Cygni7 9 месяцев назад +1

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

    • @Cygni7
      @Cygni7 9 месяцев назад +1

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

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

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

  • @blanky_nap
    @blanky_nap 6 месяцев назад

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

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

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

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

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

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

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

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

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

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

    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  2 года назад +1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @public_sensei
    @public_sensei 9 месяцев назад +3

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

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

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

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

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

    • @imadna5810
      @imadna5810 26 дней назад

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

  • @Sergey-cz7ym
    @Sergey-cz7ym Год назад +1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @duke007x3
    @duke007x3 2 года назад +94

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

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

      😁

    • @podgorniy.r
      @podgorniy.r 2 года назад +8

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

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

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

    • @elvin_burunduchock
      @elvin_burunduchock 10 месяцев назад +7

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

    • @YouTubeqtew
      @YouTubeqtew 8 месяцев назад +2

      @@elvin_burunduchock Нет

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

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

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

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

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

      @@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  Год назад

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

  • @x-user-agent
    @x-user-agent 2 года назад +4

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

    • @x-user-agent
      @x-user-agent 2 года назад +15

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

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

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

  • @QqqXxx-pi6gh
    @QqqXxx-pi6gh 2 года назад

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

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

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

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

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

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

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

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

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