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

  Рет қаралды 85,327

selfedu

selfedu

2 жыл бұрын

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

Пікірлер: 176
@user-cb1kz3mv7j
@user-cb1kz3mv7j 3 ай бұрын
Объяснение "Зачем" - это ключевой момент, как мне кажется. Без этого все эти методы просто набор команд, которые выветрятся из памяти без применения. А понимая зачем, больше шансов, что они вспомнятся в нужный момент)))
@n0rmaLman
@n0rmaLman 2 жыл бұрын
Особая благодарность за разъяснения "зачем".
@antonvorobiev9507
@antonvorobiev9507 2 жыл бұрын
СПАСИБО Вам за Ваш труд! Ваши лекции лучшие из тех, что встречаются на просторах Ютуба.
@user-jo5ij6df1d
@user-jo5ij6df1d Жыл бұрын
Ролик всего лишь чуть более пятнадцати минут, а чтобы утоптать его в голову, понадобился без малого целый день. И то степень усвоения материала - иллюзия понимания. Автору очередное большое спасибо.
@fatimaal-tavill6048
@fatimaal-tavill6048 Жыл бұрын
Как же точно вы описали мое состояние. А я все понять не мог, что именно не так.
@antondopira5957
@antondopira5957 10 ай бұрын
сидишь и пробуешь написать ручками, а потом что-то ради интереса поменять, чаще всего, когда непонятно "а как это повлияет на результат и сойдется ли с моим ожидаемый". У меня на каждую тему благодаря такому методу 30-40 мин уходит
@pphan_
@pphan_ 4 ай бұрын
__ЧЕКПОИНТ__ Смотрю видео уроки уже 7 день подряд пытаясь изучить ооп и у меня отлично получается! Спасибо огромное Сергею,за предоставленные знания,а я прошу пожелать мне удачи в понимании следующих тем)
@user-qy5wj2jk1n
@user-qy5wj2jk1n 2 жыл бұрын
Большое спасибо Вам за такие уроки!
@anvarx1
@anvarx1 Жыл бұрын
Отличный урок!!! Буду смотреть все ваши уроки... Спасибо огромное !!!
@tisseract
@tisseract Жыл бұрын
Спасибо за лёгкую и приятную подачу сухого материала! Ваше речевые обороты искренне радуют - "будем полагать, что мы теперь хорошо понимаем" - :)
@aidartimerbayev9600
@aidartimerbayev9600 2 жыл бұрын
Спасибо! Очень четкое объяснение магических методов.
@sergeisemenov6087
@sergeisemenov6087 6 ай бұрын
Сергей, спасибо за труд! Очень качественный материал и доходчивое разъяснение
@alexanderg9089
@alexanderg9089 2 жыл бұрын
Сергей, жму Вам руку! Отличный материал! Смотрю как уменьшается количество просмотров и лайков от урока к уроку, все таки курс ориентирован не на новичков. Но для тех кто знаком с ООП ваш материал просто клад!
@ifan6204
@ifan6204 10 ай бұрын
Огромное спасибо за такую интересную и подробную подачу материала! Вы очень талантливый преподаватель и делаете большое дело, Спасибо!
@agniusl
@agniusl Жыл бұрын
Молодец программист, начал хоть что то понимать в ООП
@Cygni7
@Cygni7 9 ай бұрын
Спасибо за вашу работу! Уверен, буду использовать этот раздел (ооп) в своих программах (пока такой уровень)). Отдельное спасибо за очень подробное объяснение основ (в первых видео этого плейлиста), это сильно упрощает последующее обучение. Удачи вам в продвижении!
@Dmitrii-Zhinzhilov
@Dmitrii-Zhinzhilov Жыл бұрын
Сергей, благодарю!! 👍🔥💯
@johnysh6480
@johnysh6480 10 ай бұрын
Спасибо за классные уроки! И мне сердечко!)
@user-nt7cg6ok6f
@user-nt7cg6ok6f 2 жыл бұрын
Вау! Спасибо большое! Это многое упрощает😅
@andredru4278
@andredru4278 2 ай бұрын
Спасибо. Отличные примеры!
@alexsidikov3426
@alexsidikov3426 Жыл бұрын
Огромное спасибо! Всегда любил учиться по системе "Если тема не понятна, меняй спикеров/учителей" и на вашем примере сработало, вы первый кто сказал что-то , что не говорили остальные и все встало на свое место :) 4:25 сижу такой и бамс, все понял , спасибо!🤩
@user-yu7vi7dc9r
@user-yu7vi7dc9r 2 жыл бұрын
Сергей, доброго времени суток. Вас беспокоит Бог. За ваш бескорыстный труд я приготовил вам место в раю. Увидимся не скоро: я вам нормально так жизню продлил. Спасибо вам и всего светлого!
@Bisirsky
@Bisirsky 2 жыл бұрын
Спасибо за урок! Не знал и использовал костыли :)
@kapwas
@kapwas 2 жыл бұрын
Запрет z спустя 5 месяцев приобретает свой смысл, лайк за видео, как всегда.
@GetEnjoyChannel
@GetEnjoyChannel Жыл бұрын
Отличный способ запретить Z использовав setattr. Пример как всегда актуальный
@sense3247
@sense3247 Жыл бұрын
Осталось удалить из английского алфавита
@CAHCrawlAdaptHide
@CAHCrawlAdaptHide Жыл бұрын
Везде надо приплести политику, клоун
@savin55589
@savin55589 Жыл бұрын
@@CAHCrawlAdaptHideПолитика везде, от неё не куда не спрятаться. Как говорил великий Немчинский, если ты не интересуешься политикой то ты не зрелый человек, вот такие пироги🤷🏻‍♂️
@vladimirastrelin1719
@vladimirastrelin1719 Жыл бұрын
Крутой урок..Спасибо большое
@donfedor007
@donfedor007 2 жыл бұрын
Интересное занятие! Можно добавлять гибкость в свой код, этими методами!
@egorkomarov4719
@egorkomarov4719 Жыл бұрын
Лучший! Спасибо
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 жыл бұрын
Супергениальный урок!!!
@user-ii5yl2fe8v
@user-ii5yl2fe8v 8 ай бұрын
Спасибо
@aleksandrsemenov1764
@aleksandrsemenov1764 2 жыл бұрын
Спасибо за урок
@artyomklimov3447
@artyomklimov3447 Жыл бұрын
Блин, ютуб, для таких видео давно должна быть функция "поставить тыщу лайков" !!!!
@user-ms7tx1bk1v
@user-ms7tx1bk1v 2 жыл бұрын
спасибо огромное
@jamjam3337
@jamjam3337 Жыл бұрын
спасибо!👏👍
@user-gv9dg4ni5g
@user-gv9dg4ni5g 2 жыл бұрын
Невероятно крут
@mslq
@mslq Жыл бұрын
Этот урок слушал 5 раз.
@fWhyJKE
@fWhyJKE Жыл бұрын
С первого раза туго пошло, второй раз пересмотрел через пару часов и всё понял. Если что-то не понятно, советую такой подход.
@rizef2166
@rizef2166 6 ай бұрын
Может кому - то так станет понятно если он не понял. Немного забегу вперед, поскольку я сначала проходил менее подробный курс и там было про наследование, то я лично смог это понять относительно легко именно поэтому, как мне кажется. Когда мы наследуем любой класс в другой класс, мы это делаем по средствам скобок после названия класса и прописываем внутри название класса от которого наследуем, в случае с классом object мы неявно наследуем его по умолчанию, как тут и сказано собственно. Мы наследуем все атрибуты класса, кроме понятно защищенных от этого. И в данном случае хоть мы и не видим все эти атрибуты в теле класса, мы всеровно можем к ним обращаться, а когда мы прописываем метод внутри дочернего класса с названием которое уже существует в материнском классе, то мы выполняем так называемое переопределение атрибута, то есть теперь у нас есть атрибут с таким же названием как в материнском классе, но выполняет он теперь при вывозе тот функционал который мы прописали. А таким синтаксисом: название_материнского_класса.название_материнского_атрибута(необходимые аргументы) мы как раз возвращаем весь тот функционал что содержится внутри материнского метода с таким же названием. Как я понимаю переопределение метода класса происходит по такому же принципу как создание атрибута для экземпляра класса, то есть когда мы создаем атрибут с таким же названием внутри класса, то python сразу находит нужный нам атрибут внутри дочернего класса и поэтому не начинает искать в материнском классе на который ссылается этот самый дочерний
@gayratsaidakhmedov5451
@gayratsaidakhmedov5451 4 ай бұрын
спасибо
@random_act
@random_act 7 ай бұрын
необычной понятности примеры
@ARSEN55630
@ARSEN55630 Жыл бұрын
Дуже круто мені понравилось.
@Keshtiman
@Keshtiman 2 жыл бұрын
Очень интересные и познавательные уроки, спасибо вам! Только мне кажется, что перед подачей данного материала было бы хорошо людям обьяснить про наследование от object, потому что без понимание этого, тяжело понять материал в этом уроке, что и почему делается. Спасибо
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Спасибо! Про object будет дальше в теме наследование
@defoliant
@defoliant Жыл бұрын
@@selfedu_rus на данном этапе можно было использовать super() как в прошлом уроке? или так не сработало бы?
@1010Bogdan
@1010Bogdan Жыл бұрын
Спасибо за ролик! Подскажите, пожалуйста. В примере с помощью переопределения ___getattribute___ вы сделали так, чтобы не было возможности обращаться к атрибуту "x". Правильно понимаю, что на практике правильнее будет сделать переменную "x" приватной, а не использовать переопределение __getattribute__? И ещё у меня в PyCharm ___getattribute___ вызывается даже если просто написать Point(), то есть, необязательно присваивать переменную для вызова ___getattribute___, это, наверное, потому что у меня более новая версия Python?
@impellergimpeller5133
@impellergimpeller5133 2 жыл бұрын
👍👍👍👍👍
@ibrahimoglu
@ibrahimoglu 2 жыл бұрын
👍
@Zavintyshka
@Zavintyshka Жыл бұрын
Спасибо Сергею за бан атрибута, с названием Z
@PrimaLuceAstronaut
@PrimaLuceAstronaut 2 жыл бұрын
С одной стороны, хорошо, что наконец появились видео по этой теме, но с другой стороны как-то обидно, что буквально месяц назад, для одной задачки с кодворс я сам около недели искал информацию по метапрлграммированию и магическим методам, сам разбирался в найденном, при том половина была на английском, а здесь про магические методы рассказывается буквально за пару видео и при этом понятно и информативно Появляется ощущение, что старания были напрасны(
@Romkaz92
@Romkaz92 2 ай бұрын
Выглядит так, что на посленем слайде, где написано __setattr__(self, key, value)__ - автоматически вызывается при изменении свойства кеу класса; два нижних подчеркивания после (self, key, value) лишние. Верно ли это замечание? Или они там нужны?
@osvab000
@osvab000 2 жыл бұрын
Первый, как всегда лайк.
@vs_gaming3013
@vs_gaming3013 Жыл бұрын
Благодарю за столь понятное пояснение! Подскажите, в чем разница между Super и object? Когда мы используем метод __new__, мы обращаемся к Super(), а здесь же для __delattr__ (и всех остальных в этом видео) - используем object. Мы ведь и для __new__ тоже можем использовать object?
@selfedu_rus
@selfedu_rus Жыл бұрын
Спасибо! Разница в том, что super() позволяет обращаться непосредственно к базовому классу (а иерархия наследования может быть самой разной), а через object мы обращаемся к самой вершине иерархии.
@vs_gaming3013
@vs_gaming3013 Жыл бұрын
@@selfedu_rus Огромное спасибо!
@noookm
@noookm Жыл бұрын
Правильно ли я понимаю, что в видео в местах переопределения магических методов происходит один из принципов ооп - полиморфизм?
@kotovasya87
@kotovasya87 2 жыл бұрын
Благодарю за урок. Хорошее разъяснение присваивания с self на 2:50. По примеру метода __setattr__: если удалить строку с "object ...", то в результате выполнения кода всё равно метод вызывается 4 раза. Для чего тогда строка "object ..."?
@heshagrade
@heshagrade 2 жыл бұрын
Строка с "object.__setattr__" обеспечивает непосредственно работоспособность метода. А то, что наблюдается вызов 4 раза, это всего лишь отрабатывает print() внутри этого метода, то есть метод был вызван, но без строки с "object" он никакой работы не выполнил. И чтобы убедиться в этом достаточно вывести все атрибуты после инициализации через pt1.__dict__, например. И попробовать это сделать со строкой "object.__setattr__" и без неё.
@mrrototo761
@mrrototo761 3 ай бұрын
Теперь понятно где можно использовать @classmethod 😅
@uniqqquniqqq2053
@uniqqquniqqq2053 Жыл бұрын
Возможно вам стоит оставлять номер или ссылки для донатов под видео. Настолько понравились видео, что я бы вам задонатил небольшую сумму. И наверно еще такие люди найдутся :)
@selfedu_rus
@selfedu_rus Жыл бұрын
спасибо, просто сейчас многие такие сервисы отсеялись, поэтому кроме yoomoney кошелька нечего указывать...
@user-uv1jv8bt5i
@user-uv1jv8bt5i Жыл бұрын
10:06 Мы бы не хотели что бы создавался атрибут с именем Зет("z") :)
@user-ox7kc4fd1m
@user-ox7kc4fd1m Жыл бұрын
ахахаха
@zetmixbeatz
@zetmixbeatz Жыл бұрын
Обидно
@PavelNebo
@PavelNebo Жыл бұрын
хахах, я тож заметил.. потом глянул дату выхода видео - 26 нояб. 2021 г. Он что-то знал ?)))
@spraysferry9841
@spraysferry9841 Жыл бұрын
@@zetmixbeatz почему обидно? Єто знак нацистов и ужасних людей.
@zetmixbeatz
@zetmixbeatz Жыл бұрын
@@spraysferry9841 на мой ник взгляни
@MentoSGaming27rus
@MentoSGaming27rus 2 жыл бұрын
Такой вопрос, это нужно больше для понимания или же применяется на практике? урок как всегда супер, все понял, спасибо вам))
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Спасибо! На практике это все используется, лучше знать, лишнее я стараюсь не давать.
@xut4mah
@xut4mah 7 ай бұрын
а можно ли в данном примере с __getattribute__ обращаться к родительскому классу через super().__getattribute__() и если да, то в чём будет отличие от обращения через object.__getattribute__()
@selfedu_rus
@selfedu_rus 7 ай бұрын
При множественном наследовании super() дает непосредственно текущий базовый класс, а не самый базовый object. Во всем остальном без разницы. Метод __getattribute__() можно и так и так вызывать.
@PrimaLuceAstronaut
@PrimaLuceAstronaut 2 жыл бұрын
Кстати, ещё вопрос на уточнение. Я правильно понимаю, все классы, которые не наследуются от созданных нами, наследуются от object, у которого метакласс это type?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
да, в версии Python3 все классы неявно наследуются от object, если не прописаны какие-либо другие базовые классы и также у всех классов по умолчанию идет метакласс type.
@vitaliyvorona9990
@vitaliyvorona9990 2 ай бұрын
@selfedu_rus - its genius 🎉 Вы настолько тонко подметили про "z" attribute, что я тут же пришел в сообщения Вам написать, насколько Вы правы и заметил, что я не один такой 😉 Спасибо, очень интересные, компактные и емкие лекции. 👍🏻
@babanlive
@babanlive 2 ай бұрын
думаю все поняли о чем шла речь. ☮
@vladsnisar2207
@vladsnisar2207 2 жыл бұрын
почему при создании экземпляра класса через __new__ мы вызываем super(), а при использовании этих магических методов просто обращаемся к нему как object? Edit: super() возвращает ссылку на object, а когда пишем object, то напрямую обращаемся? Тогда есть ли разница в этих способах доступа к базовому классу?
@beribanyu
@beribanyu 2 жыл бұрын
Поддерживаю вопрос, тоже интересно
@user-ku1th4oh1k
@user-ku1th4oh1k 2 жыл бұрын
@@beribanyu Как понял я: Если мы используем object, то при return нам нужно указать первым параметром self, а при использовании super это делается автоматически. То есть ,по сути, одно и тоже
@vikeykava
@vikeykava Жыл бұрын
10:05 актуальненько))
@user-mk6yf4lu3p
@user-mk6yf4lu3p 8 ай бұрын
Можно вопрос тем кто шарит? когда мы переопределяем метод __getattribute__ мы указали object как базовый класс и передали self и item ( object.__getattribute__(self, item) ). Но насколько я понял мы можем также указать вместо object super(). Но когда используешь super() то нужно передавать только item. ( super().__getattribute__(item)). Почему такая разница если мы в и том и в другом случае ссылаемся на родительский класс object ???
@selfedu_rus
@selfedu_rus 8 ай бұрын
очень просто, object - это сам базовый класс, а super() - это объект базового класса, поэтому первый параметр self передается автоматически.
@user-mk6yf4lu3p
@user-mk6yf4lu3p 8 ай бұрын
@@selfedu_rusСпасибо за ответ! Правильно ли я понимаю, что использования super() как ссылку на базовый класс для переопределение методов не будет ошибкой? или же правильнее указывать сам базовый класс?
@selfedu_rus
@selfedu_rus 8 ай бұрын
@@user-mk6yf4lu3pлучше super()
@user-mk6yf4lu3p
@user-mk6yf4lu3p 8 ай бұрын
@@selfedu_rus Спасибо за объяснения!
@user-et4if5gs8z
@user-et4if5gs8z 2 жыл бұрын
понемногу становлюсь магом
@mammonth02
@mammonth02 2 жыл бұрын
привет
@andreistasevich9894
@andreistasevich9894 2 жыл бұрын
Мы бы не хотели, чтобы появлялся атрибут "z". Внезапно)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
и случайно ))
@BeginBye
@BeginBye 2 жыл бұрын
Тоже вот хотел такое же написать, а оно раз - и есть уже))
@orthodox-chanel
@orthodox-chanel Жыл бұрын
как часто эти атрибуты используются в реальной работе?
@prto4kin359
@prto4kin359 Жыл бұрын
Достаточно часто, что бы знать как пользоваться
@ussenUtebayev
@ussenUtebayev Жыл бұрын
Я так понимаю мы "якобы" меняем поведение магического метода но просто вызывая это у object можно сказать что мы засовываем промежуточные команды.
@alexeyxopyc2471
@alexeyxopyc2471 Жыл бұрын
спасибо за урок!) не совсем понимаю как это работает) похоже на то что эти магические методы при создании класса автоматически добавляются без их определения и работают в каком то "режиме по умолчанию"...а когда уже мы их объявляем - мы их работу немного корректируем по своему усмотрению... либо я не понял как мы после определения метода вызываем тот же метод : def __getattribute__(self,item): return object.__getattribute__(self,item):
@selfedu_rus
@selfedu_rus Жыл бұрын
да, все верно, каждый класс в Python3 наследуется (неявно) от object
@alexeyxopyc2471
@alexeyxopyc2471 Жыл бұрын
@@selfedu_rus а , ну то есть они все в object уже прописаны)) спасибо!)
@ablivion4457
@ablivion4457 6 ай бұрын
Здравствуйте! Я так понимаю return object.__getattribute__(self, item) и return super().__getattribute__(item) это аналогичные записи?
@selfedu_rus
@selfedu_rus 6 ай бұрын
в целом, да
@marat_shaydulin
@marat_shaydulin 10 ай бұрын
Интрересно, что с методом __getattribute__ такой же фокус, как с __setattr__ не прокатывает и: def __getattribute__(self, item): print("here is the value:") return self.__dict__[item] вызывается рекурсивно. Почему так?
@Cygni7
@Cygni7 9 ай бұрын
Думаю потому,что __dict__ тоже является атрибутом self. И self.__dict__ [item] по сути является вызовом (получением) атрибута этого экземпляра, что вызывает рекурсию. Но лучше подождать объяснения от автора))
@Cygni7
@Cygni7 9 ай бұрын
А при использовании __setattr__ хоть мы и изменяем содержимое атрибута __dict__,но не делаем это напрямую, например self.__dict__ = что то, а меняем один из его элементов (некоторый атрибут self'а), и это не считается за изменение атрибута, поэтому рекурсии нет. Опять же, автор лучше знает, я высказал что думаю)
@user-te3ny1jh3b
@user-te3ny1jh3b 8 ай бұрын
Почему при вызове магических методов __new__() мы обращались к классу super(), а при вызове этих магических методов обращаемся к классу object
@selfedu_rus
@selfedu_rus 8 ай бұрын
object - это самый базовый класс, а super() возвращает первый базовый класс (на данном уровне object и super() работают одинаково)
@user-te3ny1jh3b
@user-te3ny1jh3b 8 ай бұрын
@@selfedu_rus спасибо
@user-hh6tx4wg2j
@user-hh6tx4wg2j Жыл бұрын
Поправьте меня если я не прав, но во второй части напутано, пом меньшей мере в терминологии... 5.25 - здесь в определениях говорится о "свойствах класса", когда в реальности рассказывается об instance variables, а не о class variables, как можно подумать, и как подумает любой, ведь в первой части рассказывалось именно о class variables.
@selfedu_rus
@selfedu_rus Жыл бұрын
Магические методы __setattr__, __getattribute__, __getattr__ и __delattr__ служат для обработки локальных атрибутов экземпляров классов
@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.
@blanky_nap
@blanky_nap 6 ай бұрын
А какая разница между этими магическими методами и дискрипторами?
@The_Establishment
@The_Establishment 3 ай бұрын
Станут ли задания по ООП на степике когда-нибудь бесплатными ?)
@selfedu_rus
@selfedu_rus 3 ай бұрын
нет
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd Жыл бұрын
Так получается MIN_CORD в случае когда мы не юзаем classmethod для присвоения ему значения - становиться атрибутом экземпляра класса?
@selfedu_rus
@selfedu_rus Жыл бұрын
да, т.к. мы используем ссылку на класс
@reversika7272
@reversika7272 3 ай бұрын
Можете, пожалуйста, подсказать, почему в __setattr__, если присваивать значение атрибуту определенному, открывается рекурсия?
@selfedu_rus
@selfedu_rus 3 ай бұрын
Только что отвечал на это в ТГ-канале. Подписывайтесь на него. Приоритет вызова дескриптора выше, чем у обычной переменной, поэтому конструкция self.name=name вызывает дескриптор по рекурсии
@Majohne
@Majohne 3 ай бұрын
|__setattr__| вызывается всякий раз при присвоении. Если в нем присвоить значение, то он опять вызовется, опять присвоится, опять вызовется и вот рекурсия
@reversika7272
@reversika7272 3 ай бұрын
@@Majohne спасибо Вам большое! Теперь я поняла😊
@reversika7272
@reversika7272 3 ай бұрын
@@selfedu_rus спасибо большое Вам!😊
@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 жыл бұрын
Если вы хотите совсем жестко запретить доступ, то как вариант, но на практике достаточно просто пометить атрибуты как private или protected, чтобы программист знал, что к ним не следует обращаться. Ну а если он нарушит это правило, то работоспособность программы на его совести. Профессионалы так не делают.
@DuhaxD
@DuhaxD 2 жыл бұрын
@@selfedu_rus Понял, спасибо.
@StrikerNSK1
@StrikerNSK1 Жыл бұрын
Почему в __setattr__ не используется return? Опечатка или его особенность?
@brushupyourenglish3455
@brushupyourenglish3455 Жыл бұрын
А зачем Вам что-либо возвращать из этого метода? Вы уже определили новый атрибут через super().__setattr__(...). А если нужно вернуть значение атрибута, то уже непосредственно вызывается метод get
@heshagrade
@heshagrade 2 жыл бұрын
На 6:41 есть ли разница между object.__getattribute__(self, item) и super().__getattribute__(item) ?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Нет, разницы не будет
@heshagrade
@heshagrade 2 жыл бұрын
@@selfedu_rus почему тогда при использовании super().__delattr__(item) возникла ошибка, а при object.__delattr__(self, item) нет?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
@@heshagrade Если у вас имеется иерархия наследования, то родительский уже будет не object, т.е. функция-объект super() возвратит другой класс и из-за этого возможны ошибки. Поэтому здесь лучше обращаться через object.
@rahoti5765
@rahoti5765 Ай бұрын
зачем существует и object и super()? При чём __new__ работает через оба вызова, а __getattribute___ только через вызов object? похоже что super ссылается просто на родителя, а object к object - самому верхнему классу
@selfedu_rus
@selfedu_rus Ай бұрын
Это простые вопросы в ТГ-канал по Python. Сообщество ответит.
@imadna5810
@imadna5810 Ай бұрын
сам ответил на свой вопрос )
@user-kp7qh4yb6m
@user-kp7qh4yb6m Жыл бұрын
А почему вызывается именно object?
@prto4kin359
@prto4kin359 Жыл бұрын
Все классы в питоне неявно наследуются от object, поэтому и вызывается именно он, т.к. в нем прописаны все эти маг. методы.
@Sergey-cz7ym
@Sergey-cz7ym Жыл бұрын
А почему раньше мы обращались к родительскому классу через super а тут через object? Можно вместо object писать super?
@selfedu_rus
@selfedu_rus Жыл бұрын
object - это самый верхний (базовый) класс, а super() выдает следующий базовый, от которого мы наследовались. Если наследований явных не было, то super() и object ведут на один и тот же класс.
@user-js4yf3dv9g
@user-js4yf3dv9g Жыл бұрын
А почему если мы хотим изменить атрибут класса Point, нам просто не написать Point.min_coord = 100 ? вместо целого classmethod ?
@selfedu_rus
@selfedu_rus Жыл бұрын
чтобы через экземпляр класса менять атрибут класса
@duke007x3
@duke007x3 2 жыл бұрын
Мы бы не хотели, чтобы появлялся атрибут с именем 'Z'. Очень актуально
@selfedu_rus
@selfedu_rus 2 жыл бұрын
😁
@podgorniy.r
@podgorniy.r 2 жыл бұрын
вуду-программист)
@PavelNebo
@PavelNebo Жыл бұрын
Если бы в реальной жизни можно было просто взять и написать эксепшен)))
@elvin_burunduchock
@elvin_burunduchock 11 ай бұрын
С хрена ли? Этому атрибуту везде дорога.
@YouTubeqtew
@YouTubeqtew 9 ай бұрын
@@elvin_burunduchock Нет
@sergioramos4562
@sergioramos4562 2 жыл бұрын
Ребзя как долго вы учите Pyhton и что хотите на нем писать???
@prto4kin359
@prto4kin359 Жыл бұрын
4 месяца, работать з данными и парсингом
@public_sensei
@public_sensei 9 ай бұрын
В Украине уже как полтора года запрещены атрибуты Z😁
@Eazy1art
@Eazy1art Жыл бұрын
Я запутался, понятия "атрибут класса" и "свойство класса" - это синонимы
@selfedu_rus
@selfedu_rus Жыл бұрын
в общем, да, но чаще СВОЙСТВА я отношу к переменным, а АТРИБУТЫ - ко всем элементам класса (методам, переменным и т.п.)
@Eazy1art
@Eazy1art Жыл бұрын
@@selfedu_rus Хорошо, спасибо
@kra1dex
@kra1dex Жыл бұрын
возможно туповатый вопрос, но зачем создавать атрибут, чтобы потом запретить обращаться к нему? 8:20
@selfedu_rus
@selfedu_rus Жыл бұрын
да, это конечно вопрос вопросов ))) в примере особо им не по пользуешься, просто демонстрация принципа работы не более того
@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 жыл бұрын
а почему вызов через object. а не через super()?
@x-user-agent
@x-user-agent 2 жыл бұрын
сам и отвечу) погуглил - и так и так можно)
@prto4kin359
@prto4kin359 Жыл бұрын
@@x-user-agent Но только если ваш класс не наследуется от другого
@QqqXxx-pi6gh
@QqqXxx-pi6gh 2 жыл бұрын
Есть тут люди которые проходят и главное понимают все что он снимает ? Как вы это будете применять на практике и ТД
@qemist7570
@qemist7570 2 жыл бұрын
В вакууме, понятное дело, все это лютейшая абстракция. Но если потыкаться самому, сделать хотя бы простенький проект с применением этих штук - очень быстро доходит, как по мне. Ну и еще имеет смысл держать в голове, что ООП раскрывает себя на реально огромных проектах, где находят применение методы из этого видоса, например. Если интерес есть, можешь посмотреть какие-нибудь опенсорс проекты, чтобы увидеть реализацию на практике И честно, на этом канале обычно самая понятная подача материала, как минимум для меня, из всего, что я смотрел/читал, в том числе и по ООП Вообще, если прям докапываться, хотелось бы побольше отсылок на примеры из реальных задач, где все это применяется и реализацию, но это такое
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Посмотрите фреймворк Django (на этом канале) и увидите, что он без ООП просто немыслим )
@KonstantinYurievich
@KonstantinYurievich 2 жыл бұрын
Понятно практически все, что Сергей объясняет, но лично я, веду конспект всего материала, иначе информация не удерживается в голове, по крайней мере, у меня. И обязательно закрепляю практикой большую часть материала. Конечно, если просто смотреть, как киношку, то толку 0.
@prto4kin359
@prto4kin359 Жыл бұрын
@@KonstantinYurievich Полностью с вами согласен, так же конспектирую в отдельном файле
😱СНЯЛ СУПЕР КОТА НА КАМЕРУ⁉
00:37
OMG DEN
Рет қаралды 1,8 МЛН
НЕОБЫЧНЫЙ ЛЕДЕНЕЦ
00:49
Sveta Sollar
Рет қаралды 7 МЛН
ISSEI funny story😂😂😂Strange World | Pink with inoCat
00:36
ISSEI / いっせい
Рет қаралды 28 МЛН
Интерфейсы в Python
14:45
Денис Бречка
Рет қаралды 6 М.
Магические методы в python. Dunder методы
1:00:45