Тёмный

#11. Дескрипторы (data descriptor и non-data descriptor) | ООП Python 

selfedu
Подписаться 152 тыс.
Просмотров 75 тыс.
50% 1

Курс по Python ООП: stepik.org/a/116336
Узнаете, что такое дескрипторы, их виды: data descriptor и non-data descriptor, отличие и принцип работы.
Инфо-сайт: proproprogs.ru/python_oop
Telegram-канал: t.me/python_selfedu

Опубликовано:

 

5 дек 2021

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 198   
@heshagrade
@heshagrade 2 года назад
Это ж надо было застрять на этой теме, посмотреть несколько раз тут, посмотреть в других местах, поковырять этот дескриптор, чтоб потом в самом-самом конце видео услышать, что на практике это применяется редко :D
@playt_pythonlearn
@playt_pythonlearn 2 года назад
для себя желательно знать, мы же не знаем что в жизни точно пригодится
@printon4087
@printon4087 Год назад
Привыкай
@AimK-ij9nu
@AimK-ij9nu Год назад
Ты спас меня от мучения!! Я уже собирался идти по твоему пути хаха))
@user-hv4lr2lx4i
@user-hv4lr2lx4i Год назад
Ну дело в том что это вообще типично для программирования. Обычно есть несколько решений со своими достоинствами и недостатками каждое. И если решение выглядит сложным - скорее всего оно редко применяется. Люди ищут другие и мирятся с их недостатками. НО. Никто не сказал что рано или поздно вам не придется писать например библиотеку. Где подобное нужно. Поэтому можно не понимать все тонкости но знать что такое есть к как примерно устроено полезно. Понадобится - вот тогда и разберетесь.
@the_huge_knight
@the_huge_knight 9 месяцев назад
Это используется для сокращения строк кода, как обёртка этих геттеров и сеттеров классом высшего уровня. Можно просто скопировать эти строки кода и в них (методах __get__ и __set__) делать уже что угодно.
@agility3554
@agility3554 2 года назад
instance - экземпляр (экземпляр класса) owner - владелец ( класс, от которого был создан экземпляр)
@user-wt6vq1nw3g
@user-wt6vq1nw3g Год назад
Два вечера разбирался в дескрипторах. Пока на бумажках подробно не расписал алгоритм работы со всеми стрелочками и пояснениями, что к чему относится и чем является, не мог разобраться. Просто в голове не помещалась такая громоздкость. Спасибо огромное за подробное и исчерпывающее объяснение столь мозгодробительной темы!
@sega6574
@sega6574 2 года назад
объяснение на нереально крутом уровне, спасибо огромное Вам, дорогой!
@biglakecom
@biglakecom 10 месяцев назад
Сергей, спасибо вам огромное! На ваших видео понимаешь лучше, чем на любом платном курсе
@tbassir9076
@tbassir9076 11 месяцев назад
Респектище учителю! Посмотрев этот ролик, немного больше понимаешь, благодаря прошлому ролику, но всё же надо ещё раз пройти.
@trane7266
@trane7266 Год назад
спасибо за урок, хоть на практики и редко применяется, но я всё равно относительно много времени потратил чтоб всё выучить, в любом случаи понимание программирование стало немножко получше благодаря, этому ролику, ещё раз спасибо!
@user-br7hg4by2j
@user-br7hg4by2j 2 года назад
Спасибо, очень полезная информация и как всегда прекрасное объяснение (всё понятно с первого раза)!
@logistloglab5243
@logistloglab5243 Год назад
Сергей, великолепное объяснение, спасибо!
@user-qx3ri5kc2q
@user-qx3ri5kc2q Год назад
про хожу очень быстро все уроки и забываю лайки проставить ( Обещаю вернусь и все сделаю ) спасибо за урокиБ сейчас трудно найти нормальное объяснение ООП
@user-yo2oi7qz3l
@user-yo2oi7qz3l Год назад
Отличный урок!Отличное объяснение темы!
@viktorsk8202
@viktorsk8202 Год назад
Очень подробно объяснили, спасибо Сергей!
@user-db2ug8tr5o
@user-db2ug8tr5o 10 месяцев назад
Сергей , благодарю за предоставленный материал. Тема действительно показалась сложной на первый взгляд и похожа на паззл, но освоить ее вполне возможно. Это еще и оочень сильно напрягает(тренирует) мозги)
@albertasatryan1477
@albertasatryan1477 Год назад
один из уроков, который чтобы освоить нужно несколько раз смотреть, но объяснение хорошее, спасибо
@_garik__
@_garik__ Год назад
Крутое обьяснение. Понятно и зачем и как работает. Главное во всех этих ссылках не запутаться.
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 года назад
Спасибо! Это гениально) Все на самом деле просто и четко)
@jeff2658
@jeff2658 10 месяцев назад
Легенда, твой курс будут смотреть пока Пайтон существует
@narvere
@narvere Год назад
Интересная тема и хорошее объяснение. Спасибо!
@tisseract
@tisseract Год назад
Очень прикольно! Но действительно сложно. Особенно, если плохо разбираться в логике интерпретатора Python :(
@user-pv6ut2uo3t
@user-pv6ut2uo3t 2 года назад
Вот уж воистину теория без практики мертва. Только после того, как появился курс на степике и порешал задачки, смог понять эту тему. И действительно громоздко, но ничего сложного.
@redvizer8337
@redvizer8337 Год назад
хотелось бы узнать как реализовать дескриптор на примере прошлого урока где мы писали 4 проверки для фио, возраста, пасспорта
@user-qj6tk5fw9p
@user-qj6tk5fw9p 11 месяцев назад
даужь, тема и в прям очень сложная. спасибо Вам большое что разжевали ее для нас
@fo_res
@fo_res 6 месяцев назад
Сегодня пригодилась эта тема, значительно сократила код
@rembomenlee
@rembomenlee 6 дней назад
С версии Python 3.9 декораторы @classmethod и @property можно было использовать вместе для создания "свойств класса". Однако с Python 3.13 эта возможность устарела и больше не поддерживается.
@user-dc7bn4bt4e
@user-dc7bn4bt4e 2 года назад
для более корректного отображения сообщения об ошибке можно использовать функцию repr, Например: TypeError(f'Не разрешённый тип данных у объекта - {repr(value)}') Функция repr() принимает объект питона и конвертирует его в строку, т.е. он будет отображаться в выводе также, как и у вас в IDE Её можно применять в связке с eval или exec, ну да там уже сами нагуглите :)
@selfedu_rus
@selfedu_rus 2 года назад
Спасибо, про repr было в магических методах!
@user-et4if5gs8z
@user-et4if5gs8z 2 года назад
впервые не всёпонял с первого раза буду возвращаться к теме позднее
@igorratnik2357
@igorratnik2357 Год назад
Спасибо Сергей. Отличная подача материала!
@user-qp8hg4ds2b
@user-qp8hg4ds2b 2 года назад
Сергей, спасибо вам огромное за видео! Но скажите, раз мы имеем такой инструмент как дескриптор, то когда мы все же используем сеттеры и геттеры, когда объекты класса property()? Спасибо!
@selfedu_rus
@selfedu_rus 2 года назад
Здесь все зависит от удобства создания программ, т.е. от задачи. Если нужно реализовать что-то вроде свойств (property) и их много, но логика работы одинаковая, то лучше посмотреть в сторону дескрипторов. То есть, все это инструменты сокращения кода и избежать его дублирования.
@user-hq8df4mj2r
@user-hq8df4mj2r Год назад
Решил пересмотреть, хотел убедиться что owner это ссылка на класс где применяется дескриптор. Спасибо за урок.
@user-rf3ne5ih4h
@user-rf3ne5ih4h 2 года назад
Приветствую 🖖 Отличный у вас канал, столько полезной инфы, а главное все понятно. Но вот не нашел у вас ответа, и в интернете не смог найти. Если у меня асинхронно запущен loop, который исполняет какие-то действия до тех пор пока его не отключат. Отключаю его я комбинацией ctrl+c. Есть ли возможность передать данные в запущенный loop извне? Например передать ему команду stop()
@selfedu_rus
@selfedu_rus 2 года назад
Спасибо! Сам не знаю. Это у ребят надо спросить )
@Piro_
@Piro_ Год назад
АААА б̶у̶д̶у̶ ̶п̶р̶о̶с̶т̶и̶т̶у̶т̶к̶о̶й я смогу понять дускрипторы >,.,
@jamjam3337
@jamjam3337 Год назад
Спасибо!
@whosane9923
@whosane9923 10 месяцев назад
Полезная штука , код сократил 116 строк до 56
@tetris2703
@tetris2703 10 месяцев назад
Добрый день, а можете прокомментировать на 16:00, почему обращение через getattr и setattr более корректно с точки зрения python? Почему не стоит обращаться через коллекцию?
@user-tb2jp7kg2c
@user-tb2jp7kg2c 2 года назад
Сергей, спасибо! Только не совсем понятно, когда мы прописываем x=Integer() внутри класса Point3D, каким образом присваивается значения свойств instance, owner, value. Ведь у класса Integer мы не прописали конструктор init, и в явном виде в выражении x=Integer() мы не передаем никаких параметров
@selfedu_rus
@selfedu_rus 2 года назад
Методы __set__, __get__ и прочие - это магические методы, т.е. они автоматически срабатывают в определенных ситуациях. Вызов прописывается либо на уровне стандартных базовых классов (для некоторых), либо делается на уровне самого интерпретатора языка. Дескрипторы отрабатывают на уровне интерпретатора и значения в параметры подставляются автоматически именно им. Отсюда и вся магия )
@viktorsokolov8153
@viktorsokolov8153 Год назад
@@selfedu_rus Я тоже попался на этом моменте. В самом магическом методе __set_name__ нет описания, поэтому каким образом х из х = Class() попадает в self.name непонятно. Очень глубоко.
@user-zm5nd9vu7n
@user-zm5nd9vu7n 3 месяца назад
там ошибка, на 18 минуте говорите создаём дескриптор не данных ,а 19ю40 говорите сделаем из ред Х дескриптор не данных снова, хотя делаете дискриптор данных наоборот
@Developer_python_
@Developer_python_ Год назад
Шикарная тема-жалко что редко на практике пишем дескрипторы))))
@Vena_5
@Vena_5 9 месяцев назад
А зачем нужен дескриптор данных? Вот можно же прямо считать с экземпляра класса ту или иную переменную
@Developer_python_
@Developer_python_ 9 месяцев назад
@@Vena_5 почитайте о свойствах. Они под капотом используют дескрипторы. Только последние более продвинутые
@Vena_5
@Vena_5 9 месяцев назад
@@Developer_python_ , ладно, благодарствую
@nilmulyashov7274
@nilmulyashov7274 2 года назад
Здравствуйте, большое спасибо за уроки! Хотел написать, что ссылка в соответствующем уроке на Вашем сайте ведет не на этот ролик.
@selfedu_rus
@selfedu_rus 2 года назад
Спасибо, поправил!
@MRaynold
@MRaynold 4 месяца назад
Ой, пойдёт! 😄👍
@XDeVAlien
@XDeVAlien Год назад
4:48 - Почему на картинке "делитер" это __del__(self)? Наверное всё-таки должен быть def __delete__(self, instance). И тогда должно выглядить так: def __delete__(self, instance): delattr(instance, self.name)
@gayratsaidakhmedov5451
@gayratsaidakhmedov5451 5 месяцев назад
спасибо
@rojoohn
@rojoohn 9 месяцев назад
А как можно реализовать код из прошлого урока с использованием геттеров и сеттеров, если там каждый параметр экземпляра класса имеет собственные методы обработки (фио, возраст, номер паспорта, вес)? Ведь в дескрипторе лишь один универсальный сеттер. Значит ли это, что дескрипторы подходят только для работы с параметрами экземпляра класса, которые имеют единственный и универсальный метод обработки (например, координаты точек должны иметь целочисленное значение и т.д.)?
@xev1882
@xev1882 Год назад
можно ли что то передать в дескриптор и изменить поведение сеттера и геттера?
@standvik1159
@standvik1159 2 года назад
Здравствуйте, извиняюсь за не скромный вопрос. На какой самой высокой должности вам удалось работать? Спасибо за уроки!
@selfedu_rus
@selfedu_rus 2 года назад
руководитель проектов
@standvik1159
@standvik1159 2 года назад
@@selfedu_rus спасибо)
@user-th4xt6fq4u
@user-th4xt6fq4u 8 месяцев назад
@selfedu_rus Является ли нормальной практикой использование одного дескриптора данных для нескольких классов? Например, у нас есть классы Picture, Mummies, Papyrus, и мы хотим проверить каждый локальный атрибут экземпляра класса на соответствие строковому типу данных перед присвоением значения атрибуту. Можем ли мы создать один и тот же дескриптор данных (например, StringValue) для всех них? Спасибо.
@user-ou7fw1sg1r
@user-ou7fw1sg1r 2 года назад
После просмотра, почему-то препода по высшей математике вспомнил... НадА еще разок так пятьдесят посмотреть... Но тонкую нить уловил вроде...
@ADen-qx6co
@ADen-qx6co 2 года назад
спасибо за уроки, Сергей! просьба прояснить - в методе __set_name__ мы свойству name дескрипторов присваивали имя c подчеркиванием (_x). 1) при такой записи можно получить доступ к значению как через pt._x, так и через pt.x. понятно, что при обращении pt.x срабатывает геттер дескриптора, но как организовывается доступ при записи pt._x дескриптор понимает обращение к себе как по прямому имени(x), так и по имени, указанному в self.name (_x)? 2) если это сделано, чтобы показать, что x, y, z - защищенные (protected), не будет ли правильным тогда их так и назвать _x = Integer() а в __set_name__ оставить self.name = name. При такой записи, получить доступ через pt.x не получается..
@selfedu_rus
@selfedu_rus 2 года назад
Да, все верно! Здесь дескриптор лишь создает локальный атрибут в объекте Point3D и позволяет управлять с ним через объект класса Integer. Так принято делать и цели что-то жестко запретить программисту здесь нет. Одно нижнее подчеркивание лишь показывает, что переменная внутренняя, защищенная и если программист будет обращаться к ней напрямую, то могут быть проблемы. Если он все же это делает, то, как говорится, его проблемы, его предупреждали ))
@podgorniy.r
@podgorniy.r Год назад
Хороший вопрос! Единственное при обращение к pt._x мы обращаемся к локальному свойству экземпляра класса Point3D, поэтому никакого взаимодействия с дескриптором не происходит, если я правильно понял первый вопрос. Во втором случае мы можем безопасно работать с локальными свойствами экземпляра класса Point3D только через дескриптор pt.x, а в случае прямого обращения к приватному свойству pt._x, то возникают риски из-за обращения к приватному свойству вне класса. Сергей, поправьте, если я в чем-то ошибся.
@nyahcat3
@nyahcat3 9 месяцев назад
Здравствуйте! Спасибо за Ваши видео, очень познавательно и полезно. Есть вопрос: если из метода дескриптора __set_name__ убрать "_" в строке self.name = "_" + name (то есть оставить self.name = name), то выпадает исключение о достижении лимита глубины рекурсии. Почему? UPD: Кажется, разобрался: При создании экземпляра без "_" получается рекурсивная ссылка внутри класса Point3D: метод __set_name__ бесконечно вызывает х, а х ссылается на Integer(). Честно говоря конкатенация в данном случае выглядит как костыль. Есть-ли способ сделать чуть опрятнее?
@selfedu_rus
@selfedu_rus 9 месяцев назад
Да, верно поняли!
@bunta8789
@bunta8789 7 месяцев назад
Не совсем понял при каких условиях срабатывают магические методы __set_name__, __get__, __set__ в дескрипторе. Мои предположения по поводу их работы, поправьте, если я что-то не так понял: __set_name__ выполняется после создания экземпляра класса дескриптора (например x = Integer())? То есть, он как инициализатор для обычного класса работает. Но почему тогда мы явно не передаём ему параметры owner и name? (есть предположение, в виду того, что вызов идёт непосредственно из класса (Point3D), то передача owner не нужна; а вместо name в данном случае подставляется x). Напомню, что owner - это ссылка на сам класс Point3D Далее, во время инициализации экземпляра класса Point3D, self.x = x представляет собой не создание атрибута экземпляра класса, а вызов метода __set__ в дескрипторе. В самом методе, кроме self, присутствуют instance и value. Value, как я понял, представляет собой x (= 1), а instance - экземпляр класса Point3D __get__ срабатывает после команды p.x (p = Point3D(1, 2, 3)) и возвращает 1. Мы так же можем получить 1, если напишем p._x. Буду смотреть видео заново
@user-zm2fm5mr9d
@user-zm2fm5mr9d 7 месяцев назад
А почему метод verify_coord не статический? Он же не использует ни атрибуты объекта, ни атрибуты класса, а работает только со значениями, переданными ему при вызове, что характерно для статических методов, судя из прошлых уроков
@selfedu_rus
@selfedu_rus 7 месяцев назад
можно и статический сделать
@Receive_
@Receive_ 2 года назад
Сергей, дайте, пожалуйста, ссылку на практические примеры. Очень нужно закрепить материал.
@selfedu_rus
@selfedu_rus 2 года назад
ссылка под видео, курс на Stepik
@ibrahimoglu
@ibrahimoglu 2 года назад
👍
@mikelir1889
@mikelir1889 2 года назад
интересно
@AlekseyChupkov
@AlekseyChupkov 2 года назад
Уроки огонь! Не могу понять, как описать __del__ в самом дескрипторе?
@stas7che
@stas7che 8 месяцев назад
__del__ это финализатор, в дескрипторах используются __delete__
@sashaperdunov2209
@sashaperdunov2209 Год назад
можно же было написать def __setattr__(self,key,value): if type(value) != int: raise TypeError и не пришлось бы использовать дескрипторы, прикиньте, вот это я голова
@kurtmiller77
@kurtmiller77 2 года назад
Полезно. Оказывается метод __set_name__ появился в версии 3,6. Удобная штука. Взял на заметку.
@abrorizzatullaev836
@abrorizzatullaev836 Год назад
great
@teacherit5840
@teacherit5840 Год назад
Сергей также вопрос я с данным способом могу обращаться к атрибуту с режимом доступа private. То есть мне не составляет труда написать print(self._ _x) и мне выдаст ответ. Почему так?
@selfedu_rus
@selfedu_rus Год назад
Когда вы в дескрипторе создаете как бы приватную переменную (с двумя подчеркиваниями), то находитесь вне класса, где она формируется, поэтому приватной переменной не получается, а создается некий аналог публичной переменной с двумя подчеркиваниями. В общем, в дескрипторах принято создавать защищенные (protected), а не приватные переменные.
@Pro100Fart
@Pro100Fart 2 года назад
1) 19:40 может все таки превратим в дескриптор данных? А не неданных, мы же все таки добавили сеттер 2) Можно какую то ссылку где мы говорили о функциях getattr и setattr? А то помню только магические методы с таким названиям
@selfedu_rus
@selfedu_rus 2 года назад
да, оговорился, спасибо!
@Pro100Fart
@Pro100Fart 2 года назад
@@selfedu_rus а на 2 вопрос можете ответить? А то я не помню где и когда речь шла именно о функциях getattr и setattr?
@selfedu_rus
@selfedu_rus 2 года назад
@@Pro100Fart я тоже не помню уже, посмотрите по сайту: proproprogs.ru/python_oop
@ongdashsyrgash5463
@ongdashsyrgash5463 Год назад
Ответ на второй вопрос, #9 видео свойства, декоратор property посмотри в плейлисте. Там и упоминается насколько я помню
@user-hx7gj4mv5f
@user-hx7gj4mv5f Год назад
каким блин образом в сеттере дескриптора integer подставляется значение для аргумента value, откуда это значение берется? в данном примере сеттер получает значения x y z, которые передаются при создании экземпляра класса Point3D, как?. Где можно прочитать про эту логику дескрипторов?
@user-ub6cv6nk5u
@user-ub6cv6nk5u Месяц назад
Как я воспринял данный урок: Так, ну все вы видели солнце и знаете, как на нём можно греться. Но что, если нам нужно наоборот охладиться? Смотрите, берём свой ботинок в правую руку, начинаем решать тригонометрические уравнения танцуя на одной ноге, и если всё сделали правильно, вы увидите, как солнце достаёт мороженное и передаёт его вам, но так как солнце горячее, мороженное сразу же испаряется, по этому данный способ особо никто не использует, но думаю эта информация вам не помешает и может быть когда-нибудь пригодится.
@andruhaz
@andruhaz 2 года назад
Возникает логичный вопрос :) если дескрипторы используются на практике нечасто и у нас есть 10 локальных свойств и не хочется (не можется) писать дескрипторы, то придется писать 30 методов (геттер, сеттер, делитер)?
@selfedu_rus
@selfedu_rus 2 года назад
Можно даже их вынести в отдельный базовый класс (миксин) и подключать по мере необходимости. Правда в такой простой реализации этот класс будет жестко связан с набором локальных свойств дочернего класса.
@eklatov
@eklatov 2 года назад
Добрый день хочу спросить почему на 8:13 где вы показываете схему работы дескрипторов в инициализаторе класса Point3D self.x без нижнего подчеркивания как и y и z не могу это понять
@selfedu_rus
@selfedu_rus 2 года назад
потому что мы работаем с локальными _x, _y через дескрипторы x, y, которые объявлены как атрибуты класса
@Antinormanisto
@Antinormanisto 2 месяца назад
Я будто выучил древнюю магию
@AndryVanDuk
@AndryVanDuk Год назад
Вопрос, почему verify_coord обёрнут декоратором classmethod, а не staticmethod? Ведь в работе этого метода не используется переменная cls и ему не нужен доступ к классу?
@selfedu_rus
@selfedu_rus Год назад
да, здесь вполне подойдет статик
@ivanihnatsenkau8984
@ivanihnatsenkau8984 8 месяцев назад
А вот такой вопрос, как инициализатор обращается к свойствам класса x = Integer()? Ведь в его первой строчке перед именем 'x' стоит self, а ведь self тем самым формирует локальное свойство x со значением аргумента x, и никакого вызова или обращения к свойству класса x = Integer нет мы ведь не пишем Point3D.x(непосредственное обращение к свойству)
@selfedu_rus
@selfedu_rus 8 месяцев назад
Приоритеты разные, у обычных локальных атрибутов - наименьшие, дескрипторы более высокий имеют.
@pokryshkin1973
@pokryshkin1973 Год назад
если я правильно понимаю, то в методе __get__ будет выполняться type(instance) == owner, но тогда непонятно зачем передавать owner в качестве параметра. Единственное что приходит в голову - при вызове дескриптора из класса owner непосредственно, без создания instance. Типа Point3D.x = 10. Или я что-то напутал
@selfedu_rus
@selfedu_rus Год назад
наверное, на всякий случай, вдруг кому то нужно будет )
@bigsmilefriend
@bigsmilefriend 2 года назад
подскажи пожалуйста, не могу понять несколько вещей. 1. как работают функции в классе Integer, если мы их не вызывали. 2. зачем в __set_name__ и в классе __get__ нам owner, если мы его не используем?
@selfedu_rus
@selfedu_rus 2 года назад
функции вызываются автоматически - это магические методы, а параметр owner - это синтаксис магических методов, здесь мы его не используем, а в других программах можем использовать
@user-xc9no9hd4i
@user-xc9no9hd4i 2 года назад
10:19 я скорее всего неправильно понял, но мы сначала создаём локальные атрибуты pt.x = 1, а потом меняем их на _x = 1. Если я ошибаюсь объясните этот момент, пожалуйста
@selfedu_rus
@selfedu_rus 2 года назад
атрибут _x создается внутри объекта дескриптора
@gpankov
@gpankov Год назад
с 6:20 вы говорите что self - это ссылка на создаваемый экземпляр класса, а стрелочку ведете на атрибут 'x' класса 'Point3D'. Можете пояснить, что не так?
@selfedu_rus
@selfedu_rus Год назад
стрелочку веду к зеленому прямоугольнику - это на рисунке экземпляр класса Integer
@RiksaR
@RiksaR 2 года назад
Перепутал метод __getattr__ с функцией getattr(), чуть мозг не сломал.... =)
@user-ib7tj3ln2c
@user-ib7tj3ln2c 2 года назад
а почему в параметрах функции прописан owner, но он нигде не используется?
@selfedu_rus
@selfedu_rus 2 года назад
мы переопределяем функцию, поэтому должны соблюсти ее сигнатуру
@ksymbescenny8859
@ksymbescenny8859 Год назад
Подскажите как правильно прописать синтаксис в def __set_name__(self, owner, name) для приватного атрибута с двумя подчеркиваниями? Просто записать вместо 1 - 2 нижних подчеркивания не подходит "__" + name
@selfedu_rus
@selfedu_rus Год назад
Не нужно здесь приватный, мы все же извне работаем с атрибутом, а не внутри экземпляра класса.
@ksymbescenny8859
@ksymbescenny8859 Год назад
@@selfedu_rus выходит что дескрипторы нужно использовать только для "protected" атрибутов?
@selfedu_rus
@selfedu_rus Год назад
@@ksymbescenny8859 в основном, да, именно такие локальные атрибуты используются
@user-pg8ry1tm3t
@user-pg8ry1tm3t 5 месяцев назад
А как же суть инкапсуляции с сокрытием реализации сущности?..🥴 вообще в питоне используется закрытая часть классов?..
@guliev_eg
@guliev_eg 2 года назад
Привет, Сергей! Можешь, пожалуйста, более детально объяснить, когда применяется декоратор @classmethod? Например, по твоей функции verify_coord видно, что она не использует атрибуты класса и даже атрибуты самого экземпляра, то есть нет необходимости ссылаться на какой-либо объект. Это больше похоже на вспомогательную функцию, к которой нужно применить декоратор @staticmethod.
@selfedu_rus
@selfedu_rus 2 года назад
Здесь нет строгих критериев. Я больше интуитивно так сделал, т.к. эта функция для внутренней работы с методами класса. Декоратор @staticmethod по мне лучше применять для вызова функции из вне класса, например, для пересчета координат из одних единиц в другие или что-то подобное, что требуется за пределами класса, но при этом берется функция из области видимости класса. А вообще это через практику постигается. Увидите как другие делают, так и вы будете )
@user-tu7pz6vp9m
@user-tu7pz6vp9m 3 месяца назад
6:36 в нижнем описании орфографическая ошибка небольшая. Не примите за критику пжл-а
@sashaperdunov2209
@sashaperdunov2209 Год назад
Кстати, а для чего при создании дескрипторов, к их названиям прибавляются нижние подчёркивания? Спасибо Сергей
@selfedu_rus
@selfedu_rus Год назад
если этого не сделать, то при записи в переменную (внутри дескриптора) получится рекурсивный вызов (дескриптор будет все время вызываться)
@sashaperdunov2209
@sashaperdunov2209 Год назад
@@selfedu_rus спасибо
@user-vj6vj8jw9f
@user-vj6vj8jw9f Год назад
почему xr это дескриптор не данных если помимо гетера есть и другой метод
@abdulloakramov7941
@abdulloakramov7941 9 месяцев назад
Спасибо большое за урок, но тема очень сложная. 😔😔
@mikk152
@mikk152 Год назад
а почему Вы метод verify_coord сделали методом класса? В нем ведь никаких атрибутов класса мы не используем, у нас вообще их нет. Может лучше его сделать статическим? Спасибо за уроки)
@selfedu_rus
@selfedu_rus Год назад
да, лучше статическим, согласен!
@sogorich
@sogorich 2 года назад
Зачем в __set_name__ конкатенация "_" + name? Просто для отображения в коллекции? Или всё-таки это указание на то, что свойство защищено?
@selfedu_rus
@selfedu_rus 2 года назад
так принято делать при реализации дескрипторов. Одно нижнее подчеркивание показывает, что это внутреннее свойство класса и его использовать извне не нужно.
@sogorich
@sogorich 2 года назад
@@selfedu_rus Хорошо, понятно, а вот насчёт двойного подчеркивания "__" - оно используется для обозначения private свойства?
@selfedu_rus
@selfedu_rus 2 года назад
@@sogorich да
@guliev_eg
@guliev_eg 2 года назад
@@selfedu_rus Привет, Сергей! Вроде ошибка RecursionError будет, нет? Поэтому одно нижнее подчеркивание ставим, хотя можно что угодно поставить.
@user-qn8zd2tq9v
@user-qn8zd2tq9v Год назад
В документации питона написано, что при удалении дескриптора вызывается __delete__(self, instance), а не __del__(self), как показано на слайде
@selfedu_rus
@selfedu_rus Год назад
ok
@poroshochek1
@poroshochek1 7 месяцев назад
​@@selfedu_rus, и зачем вы вводите людей в заблуждение, интересно? Метод __del__ вызывается только в том случае, если он определен; но по умолчанию объект не содержит данный метод, а значит и утверждение ваше содержит только часть правды, а значит, что и в целом является неверным. Оператору del достаточно будет только наличия метода __delete__ для удаления дескриптора. И в конечно счете, комментарий выше больше был о том, что в вашем видео говорится в целом о протоколе дескриптора, но при этом приводится метод, который к данному протоколу никакого отношения не имеет (вместо того, который на самом деле там должен был быть). В данном случае слайд и пояснение к нему совершенно точно содержат ошибку, так что ваш ответ о том, что метод __del__ тоже вызывается при удалении, здесь абсолютно неуместен.
@Johniooooo
@Johniooooo 2 года назад
почему перезалив? были ошибки?
@selfedu_rus
@selfedu_rus 2 года назад
да, параметр owner неправильно объяснил )
@steamlife434
@steamlife434 10 месяцев назад
Но разве параметр owner не является ссылкой на класс из которого вызывается дескриптор?
@selfedu_rus
@selfedu_rus 10 месяцев назад
Да, поэтому в видео в кадре написано: "Внимание: owner - ..."
@hanmahanma5067
@hanmahanma5067 11 месяцев назад
У меня вопрос по обучения. Достаточно смотреть ваши уроки или необходимо все списывать с них?
@selfedu_rus
@selfedu_rus 11 месяцев назад
Это вопрос к Богу )) У каждого все индивидуально!
@user-yu2sq8fc3e
@user-yu2sq8fc3e 2 года назад
Я правильно понял, что методы __set_name__, __get__, __set__ относятся только к дескрипторам? и именно по их наличию Python считает класс дескриптором?
@selfedu_rus
@selfedu_rus 2 года назад
Нет, _set_name_ самостоятельный метод, два остальных, да, вроде, для них
@alexeyxopyc2471
@alexeyxopyc2471 Год назад
эх) посмотрел пару раз, понял для чего нужно, но не разобрался как работает(
@MEZENchannel
@MEZENchannel 2 года назад
Спасибо огромное за уроки по питону на степике и за ваши труды. вы очень мне помогли с обучением. Сейчас изучаю питон активно очень. по многу часов в день и просыпаюсь по будильнику и дальше учу.мой интерес к программированию на твердую 4. В целом есть большой интерес к разработке игр, очень большой на уровне фанатизма. Я уже ковырял файлы от майкрафта и террарии. хотел мод свой слепить. но знаний ноль. поэтому начал с питона сейчас. хотя понимаю что он не очень подходит для разработки игр и порой я думаю а туда ли я иду ?.. Но Веб разработка в принципе тоже интересна, и заказов будет явно больше чем на игры. наверно с неё и начну. после обучения основ буду учить django и flask. надеюсь это верное решение. ( хотя здесь выбор видимо между тем что нравится и реально нравится )
@Grigorev84
@Grigorev84 2 года назад
Как успехи?
@user-sb6ot3ry6l
@user-sb6ot3ry6l 6 месяцев назад
В сложных кодах такие элементы незаменимы практически
@user-nl5qu8zo3p
@user-nl5qu8zo3p 2 года назад
Немного недопонял, откуда берется свойство z у экземпляра класса, если в словаре этого экземпляра сохранено свойство _z (16:40)
@selfedu_rus
@selfedu_rus 2 года назад
это объяснялось на 11-й минуте
@TBRAK78
@TBRAK78 Год назад
Если instance.__dict__[self.name] = value , заменим на setattr(instance, self.name, value) , получается полный аналог, никаких подводных камней вроде нет*?
@selfedu_rus
@selfedu_rus Год назад
да, должно быть одно и то же, хотя, если магический метод setattr переопределен могут возникнуть особенности
@TBRAK78
@TBRAK78 Год назад
@@selfedu_rus спасибо
@_garik__
@_garik__ Год назад
@@selfedu_rus при использовании getattr, setattr возникает ошибка рекурсии. На Степике вы писали, что они вызывают магические методы, из-за этого все. Не врублюсь, почему у вас это работает, а у меня нет.
@Pluxury30
@Pluxury30 Год назад
@@_garik__ тоже самое, решили проблему?
@_garik__
@_garik__ Год назад
@@Pluxury30 да, просто забил))
@user-lj1to7le9w
@user-lj1to7le9w Год назад
На изображении на 17:20 non-data descriptor descriptor это класс содержащий только геттер. На 19:36 класс ReadIntX превращается в non-data descriptor посредством добавления сеттера. В связи с чем, у меня возникает некоторое недопонимание какой дескриптор всё таки является non-data, а какой data. И какой у кого приоритет.
@selfedu_rus
@selfedu_rus Год назад
Я оговорился, на 19:36 мы превращаем в дескриптор не данных.
@user-lj1to7le9w
@user-lj1to7le9w Год назад
@@selfedu_rus подскажите, пожалуйста, правильно ли я понимаю, что для non-data descriptor нет необходимости в методе __set_name__ ? Т.е. такой дескриптор может иметь только лишь метод возвращающий значение.
@selfedu_rus
@selfedu_rus Год назад
@@user-lj1to7le9w set_name служит для задания имени атрибута, которое возвращается. Если такой механизм не нужен, то set_name можно не прописывать.
@GROMOZEKA_NZT
@GROMOZEKA_NZT Год назад
Извините за глупый вопрос, но почему мы иницилизируем дескрипторы в классе, а не в объекте?
@selfedu_rus
@selfedu_rus Год назад
Дескриптор - это управляющая структура, а не конкретное значение. То есть, мы его сначала создаем (в целом, как объект), а затем, через этот объект можно назначать и считывать величины, которые будут заноситься в объекты, из которых они вызваны.
@killer_nekit3094
@killer_nekit3094 8 месяцев назад
можно ли такое повторить с приватными атрибутами? UPD Да, можно
@zakirovio
@zakirovio Год назад
а почему если использовать дескриптор который создает приватные атрибуты, к ним можно обращаться на прямую извне? print(p.__x) --> 1
@selfedu_rus
@selfedu_rus Год назад
нельзя, вы просто создаете публичный атрибут __x, к приватному __x он не имеет отношения (можете проверить)
@zakirovio
@zakirovio Год назад
​ @selfedu_rus немного почитал доп контент по дескрипторам, и как понял это инструмент, под капотом питона, который позволяет переопределять поведение атрибутов, доступ к ним и тп на более низком уровне. Этот протокол уже заложен в язык и работает, при объявлении методов и атрибутов, просто можно создать дескриптор с собственным дополнительным функционалом для более тонкой настройки своей программы. Еще если немного изменить код, можно добиться поведения как property(не уверен)?: def __set_name__(self, owner, name): self_name = '_' + owner.__name__ + '__' + name
@andredru4278
@andredru4278 3 месяца назад
Спасибо. Но с первого раза не дошло.
@x-user-agent
@x-user-agent 2 года назад
сслыка на Point3D😁 но всеравно спасибо👍
@selfedu_rus
@selfedu_rus 2 года назад
мда ) ну перезаливать из-за этого не стану )
@user-dt3yg2ne7c
@user-dt3yg2ne7c 8 месяцев назад
Торможу видимо, но так и не понял для чего нужен декоратор classmethod в таком коде как на 1.30. Я его убираю, все работает, вместо cls прописываю self и вызываю эту проверку в инициализаторе как в прошлом видео и тоже все работает. Какой имеено функционал дает этот декоратор кто нибудь знает?
@selfedu_rus
@selfedu_rus 8 месяцев назад
У вас self будет ссылаться на класс, а не его экземпляр. Как называть параметр вы сами решаете и то, что поменяли имя с cls на self функциональность самого параметра не меняется - это ссылка на класс при декораторе classmethod.
@user-dt3yg2ne7c
@user-dt3yg2ne7c 8 месяцев назад
@@selfedu_rus Спасибо за ответ. На самом деле всё достаточно легко и очевидно. На последних минутах видео общая картина хорошо обрисована, не знаю почему тупанул тогда) Посмотрел уроки дальше, общая картина сформировалась и теперь уже с каким то пониманием смотрю заново. Идёт в разы проще.
@R0zhkov
@R0zhkov 2 года назад
Время - 6 м. 27с. Цитата - "второй параметр это ссылка на сам класс Integer" Второй параметр "owner" указывает не на класс Integer, а на класс Point3D, специально проверял, если в __set_name__ добавить print(owner), то выдаст -
@selfedu_rus
@selfedu_rus 2 года назад
я ж там поправил и ниже текст гигантскими буквами про класс Point3D!
@R0zhkov
@R0zhkov 2 года назад
@@selfedu_rus Действительно. И ведь пересматривал не один раз, пытаясь вникнуть, а всё равно мимо прошло. Пока вы не сказали, в упор этой надписи не замечал, мозг был сконцентрирован на стрелочках.
@teacherit5840
@teacherit5840 Год назад
Почему при init для self мы берем x из атрибутов класса Point3D, а знака равно из параметров? class Point3D: x = Integer() y = Integer() z = Integer() #Приоритет обращения к локальному св-ву такой же как и к дескриптору неданных xr = ReadIntX() def __init__(self, x, y, z): self.x = x self.y = y self.z = z
@selfedu_rus
@selfedu_rus Год назад
не понял вопрос. В init self.x - это дескриптор, а просто x - переданное значение и так далее.
@teacherit5840
@teacherit5840 Год назад
@@selfedu_rus в init self.x - почему именно берется x = Integer() , а не параметр из скобок
@selfedu_rus
@selfedu_rus Год назад
@@teacherit5840 так язык устроен, self - ссылка на текущий объект и у дескриптора приоритет выше, чем у атрибута, поэтому когда пишем self.x, то ищется вначале дескриптор x в объекте, а если его там нет, то в классе. Это основы языка Python, если этого не знаете, то см. более ранние занятия, я об этом подробно говорю.
Далее
♀ 🔁 ♂ = ...❓ #OC #늦잠 #vtuber
00:12
Просмотров 1,1 млн
Protocol Or ABC In Python - When to Use Which One?
23:45
8 things in Python you didn't realize are descriptors
14:21
♀ 🔁 ♂ = ...❓ #OC #늦잠 #vtuber
00:12
Просмотров 1,1 млн