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

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

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

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

    Это ж надо было застрять на этой теме, посмотреть несколько раз тут, посмотреть в других местах, поковырять этот дескриптор, чтоб потом в самом-самом конце видео услышать, что на практике это применяется редко :D

    • @playt_pythonlearn
      @playt_pythonlearn 2 года назад +7

      для себя желательно знать, мы же не знаем что в жизни точно пригодится

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

      Привыкай

    • @AimK-ij9nu
      @AimK-ij9nu Год назад +12

      Ты спас меня от мучения!! Я уже собирался идти по твоему пути хаха))

    • @ВячеславШляхетский
      @ВячеславШляхетский Год назад +14

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

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

      Это используется для сокращения строк кода, как обёртка этих геттеров и сеттеров классом высшего уровня. Можно просто скопировать эти строки кода и в них (методах __get__ и __set__) делать уже что угодно.

  • @Сергей-ы3д8и
    @Сергей-ы3д8и 4 месяца назад +4

    Как я воспринял данный урок:
    Так, ну все вы видели солнце и знаете, как на нём можно греться.
    Но что, если нам нужно наоборот охладиться?
    Смотрите, берём свой ботинок в правую руку, начинаем решать тригонометрические уравнения танцуя на одной ноге, и если всё сделали правильно, вы увидите, как солнце достаёт мороженное и передаёт его вам, но так как солнце горячее, мороженное сразу же испаряется, по этому данный способ особо никто не использует, но думаю эта информация вам не помешает и может быть когда-нибудь пригодится.

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

    instance - экземпляр (экземпляр класса)
    owner - владелец ( класс, от которого был создан экземпляр)

  • @sega6574
    @sega6574 2 года назад +44

    объяснение на нереально крутом уровне, спасибо огромное Вам, дорогой!

  • @trane7266
    @trane7266 Год назад +6

    спасибо за урок, хоть на практики и редко применяется, но я всё равно относительно много времени потратил чтоб всё выучить, в любом случаи понимание программирование стало немножко получше благодаря, этому ролику, ещё раз спасибо!

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

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

  • @СергейУшаков-ц7ч
    @СергейУшаков-ц7ч 2 года назад +12

    Спасибо, очень полезная информация и как всегда прекрасное объяснение (всё понятно с первого раза)!

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

    Респектище учителю! Посмотрев этот ролик, немного больше понимаешь, благодаря прошлому ролику, но всё же надо ещё раз пройти.

  • @jaksonmillka
    @jaksonmillka 2 дня назад +1

    Урок #11 = Пройден
    Что ж...помните я говорил что застрял на 10-м уроке, потому что хотел более детальнее разобраться, и ушло около часа. Так вот...а вот здесь, грубо говоря, я нечерта не понял😂 Единственное что успокаивает, что автор сказал что очень редко применяется на практике. Но все же, завтра на свежею голову еще раз посмотрю объяснение. Это уже дело принципа, понять весь курс, не пропуская.
    Спасибо за урок :)

    • @jaksonmillka
      @jaksonmillka День назад

      Ура, мне все стало понятно, со второго раза. Перезагрузка пошла на пользу 😁

  • @ДокторЛям-г9ъ
    @ДокторЛям-г9ъ Год назад +2

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

  • @Hanson-e4m
    @Hanson-e4m Год назад +2

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

  • @albertasatryan1477
    @albertasatryan1477 Год назад +6

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

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

    Легенда, твой курс будут смотреть пока Пайтон существует

  • @АртемНиконов-у7я
    @АртемНиконов-у7я Год назад +3

    Отличный урок!Отличное объяснение темы!

  • @ЕрвандАгаджанян-в3к
    @ЕрвандАгаджанян-в3к 2 года назад +6

    Спасибо! Это гениально) Все на самом деле просто и четко)

  • @РыжаяБорода-ж1ъ
    @РыжаяБорода-ж1ъ Год назад +4

    про хожу очень быстро все уроки и забываю лайки проставить (
    Обещаю вернусь и все сделаю )
    спасибо за урокиБ сейчас трудно найти нормальное объяснение ООП

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

    Сергей, великолепное объяснение, спасибо!

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

    Крутое обьяснение. Понятно и зачем и как работает. Главное во всех этих ссылках не запутаться.

  • @ЕгорШишкин-г8ь
    @ЕгорШишкин-г8ь 2 года назад +11

    для более корректного отображения сообщения об ошибке можно использовать функцию repr,
    Например:
    TypeError(f'Не разрешённый тип данных у объекта - {repr(value)}')
    Функция repr() принимает объект питона и конвертирует его в строку, т.е. он будет отображаться в выводе также, как и у вас в IDE
    Её можно применять в связке с eval или exec, ну да там уже сами нагуглите :)

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

      Спасибо, про repr было в магических методах!

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

    Сегодня пригодилась эта тема, значительно сократила код

  • @ДимычДимон-г3ю
    @ДимычДимон-г3ю 9 месяцев назад +3

    В сложных кодах такие элементы незаменимы практически

  • @СарматПересветов
    @СарматПересветов Год назад +3

    даужь, тема и в прям очень сложная. спасибо Вам большое что разжевали ее для нас

  • @tisseract
    @tisseract 2 года назад +7

    Очень прикольно! Но действительно сложно. Особенно, если плохо разбираться в логике интерпретатора Python :(

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

    Очень подробно объяснили, спасибо Сергей!

  • @Юрий-х5о5щ
    @Юрий-х5о5щ 2 года назад +4

    Вот уж воистину теория без практики мертва. Только после того, как появился курс на степике и порешал задачки, смог понять эту тему. И действительно громоздко, но ничего сложного.

  • @СарварХайдаров-ч4й
    @СарварХайдаров-ч4й 2 года назад +1

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

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

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

  • @Watcherfromfar
    @Watcherfromfar 7 месяцев назад +2

    Чтобы понять эту тему, надо прочитать определение этого слова, хотя бы из википедии. Без этого трудно осознать, что творится на экране. Незнакомое слово, ассоциаций к нему нет, а значит все объяснение автора приходится цеплять к мысленной конструкции сферического коня в вакуме. И даже повторения не помогут особо, пока мозг не попробует сам придумать, с чем это связать. Предлагаю не мучиться.
    Вот это слово - Дескри́птор (от лат. descriptor «описывающий») . Запомнили? Далее, это лексическая единица (СЛОВО, СЛОВОСОЧЕТАНИЕ) информационно-поискового языка, служащая для описания основного СМЫСЛового содержания документа, или для поиска. Вот вам и смысловой ряд: ДЕСКРИПТОР - ОПИСЫВАЮЩЕЕ СМЫСЛ СЛОВО, СЛОВОСОЧЕТАНИЕ. Все сразу становиться понятнее:
    1. Создаем класс, описывающий логику для доступа к свойствам или для установки нового значения. Типа сеттеров, гетеров, разных проверок и т.д. Что угодно, что является общим для свойств разных объектов. Тут главный момент, что объекты могут принадлежать вообще разным классам. Но они все будут использовать этот класс-дескриптор, который мы создаем на этом шаге, чтобы обрабатывать свои свойства.
    2. Создаем любые нужные нам классы. Создаем в них свойства. Смотрим, видим, что некоторые свойства можно обработать, превратив их в дескриптор. Для этого делаем так, чтобы эти свойства стали экземпляром класса-дескриптора:
    property1 = DescriptorClassName()
    property2 = DescriptorClassName()
    Готово! Мы превратили property1 и property2 в дескрипторы нашего класса!
    3. А дальше пользуемся созданными классами как планировали. И когда будем обращаться к свойству-дескриптору property1, например так:
    a = MyClass(5)
    b = a.property1
    то у нас будет вызываться код из класса дескриптора, который обработает цифру 5 так, как это описано в классе дескрипторе.
    Основная килл-фича тут в том, что это не наследование, а просто такой крутой способ сократить кучу кода. Не зря в примере у автора используется такое название класса-дескриптора, как Integer (это моя догадка). Чтобы у нас аналогия появилась. Вы же используете тип int в разных классах, функциях. А если попробуете поработать с int как со строкой, то получите ошибку. Потому что у int типа есть свои внутренние проверки (как это делает класс-дескриптор). В общем, урок отличный. Большой спасибо автору, особенно за такие "хлебные крошки", скрытые подсказки как названия классов в объяснении.

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

    Спасибо Сергей. Отличная подача материала!

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

    С версии Python 3.9 декораторы @classmethod и @property можно было использовать вместе для создания "свойств класса". Однако с Python 3.13 эта возможность устарела и больше не поддерживается.

  • @РустамРаджабов-ц3м
    @РустамРаджабов-ц3м 6 месяцев назад +1

    там ошибка, на 18 минуте говорите создаём дескриптор не данных ,а 19ю40 говорите сделаем из ред Х дескриптор не данных снова, хотя делаете дискриптор данных наоборот

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

    это пизда, я 3 дня это ковырял, прошёл все стадии.
    1) Отрицание
    2) Гнев
    3) Поиск компромисса (торг)
    4) Депрессия
    5) Принятия
    В итоге, кое как разобрался, и в конце ролика слышу, "Ну на деле это применяется довольно редко"))))

  • @МамонтовОлег-в9о
    @МамонтовОлег-в9о 2 года назад +2

    впервые не всёпонял с первого раза
    буду возвращаться к теме позднее

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

    Интересная тема и хорошее объяснение. Спасибо!

  • @АлександрГращенко-н1з

    почему xr это дескриптор не данных если помимо гетера есть и другой метод

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

    АААА б̶у̶д̶у̶ ̶п̶р̶о̶с̶т̶и̶т̶у̶т̶к̶о̶й я смогу понять дускрипторы >,.,

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

    4:48 - Почему на картинке "делитер" это __del__(self)?
    Наверное всё-таки должен быть def __delete__(self, instance).
    И тогда должно выглядить так:
    def __delete__(self, instance):
    delattr(instance, self.name)

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

    Шикарная тема-жалко что редко на практике пишем дескрипторы))))

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

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

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

      @@Vena_5 почитайте о свойствах. Они под капотом используют дескрипторы. Только последние более продвинутые

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

      @@Developer_python_ , ладно, благодарствую

  • @bunta8789
    @bunta8789 10 месяцев назад

    Не совсем понял при каких условиях срабатывают магические методы __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.
    Буду смотреть видео заново

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

    Зачем проверять тип параметра внутри метода verify, есть можно использовать hints?

  • @ДімаКуріптя
    @ДімаКуріптя 11 месяцев назад +2

    А почему метод verify_coord не статический? Он же не использует ни атрибуты объекта, ни атрибуты класса, а работает только со значениями, переданными ему при вызове, что характерно для статических методов, судя из прошлых уроков

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

      можно и статический сделать

  • @андрейхоменко-и5я
    @андрейхоменко-и5я 2 года назад +2

    После просмотра, почему-то препода по высшей математике вспомнил... НадА еще разок так пятьдесят посмотреть... Но тонкую нить уловил вроде...

  • @СергейФролов-ъ5я
    @СергейФролов-ъ5я 2 года назад +6

    Сергей, спасибо! Только не совсем понятно, когда мы прописываем x=Integer() внутри класса Point3D, каким образом присваивается значения свойств instance, owner, value. Ведь у класса Integer мы не прописали конструктор init, и в явном виде в выражении x=Integer() мы не передаем никаких параметров

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

      Методы __set__, __get__ и прочие - это магические методы, т.е. они автоматически срабатывают в определенных ситуациях. Вызов прописывается либо на уровне стандартных базовых классов (для некоторых), либо делается на уровне самого интерпретатора языка. Дескрипторы отрабатывают на уровне интерпретатора и значения в параметры подставляются автоматически именно им. Отсюда и вся магия )

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

      @@selfedu_rus Я тоже попался на этом моменте. В самом магическом методе __set_name__ нет описания, поэтому каким образом х из х = Class() попадает в self.name непонятно. Очень глубоко.

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

    А как можно реализовать код из прошлого урока с использованием геттеров и сеттеров, если там каждый параметр экземпляра класса имеет собственные методы обработки (фио, возраст, номер паспорта, вес)? Ведь в дескрипторе лишь один универсальный сеттер. Значит ли это, что дескрипторы подходят только для работы с параметрами экземпляра класса, которые имеют единственный и универсальный метод обработки (например, координаты точек должны иметь целочисленное значение и т.д.)?

  • @sofiipochta
    @sofiipochta 20 дней назад +1

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

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

    можно же было написать
    def __setattr__(self,key,value):
    if type(value) != int: raise TypeError
    и не пришлось бы использовать дескрипторы, прикиньте, вот это я голова

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

    Подскажите как правильно прописать синтаксис в def __set_name__(self, owner, name) для приватного атрибута с двумя подчеркиваниями? Просто записать вместо 1 - 2 нижних подчеркивания не подходит "__" + name

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

      Не нужно здесь приватный, мы все же извне работаем с атрибутом, а не внутри экземпляра класса.

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

      @@selfedu_rus выходит что дескрипторы нужно использовать только для "protected" атрибутов?

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

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

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

    Полезно.
    Оказывается метод __set_name__ появился в версии 3,6. Удобная штука. Взял на заметку.

  • @КириллЧе-я5ы
    @КириллЧе-я5ы 8 месяцев назад +1

    А как же суть инкапсуляции с сокрытием реализации сущности?..🥴 вообще в питоне используется закрытая часть классов?..

  • @ДмитрийСергеев-л6г
    @ДмитрийСергеев-л6г 2 года назад +3

    Сергей, спасибо вам огромное за видео!
    Но скажите, раз мы имеем такой инструмент как дескриптор, то когда мы все же используем сеттеры и геттеры, когда объекты класса property()?
    Спасибо!

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

      Здесь все зависит от удобства создания программ, т.е. от задачи. Если нужно реализовать что-то вроде свойств (property) и их много, но логика работы одинаковая, то лучше посмотреть в сторону дескрипторов. То есть, все это инструменты сокращения кода и избежать его дублирования.

  • @БектурИманбеков
    @БектурИманбеков 6 месяцев назад +1

    6:36 в нижнем описании орфографическая ошибка небольшая. Не примите за критику пжл-а

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

    1) 19:40 может все таки превратим в дескриптор данных? А не неданных, мы же все таки добавили сеттер
    2) Можно какую то ссылку где мы говорили о функциях getattr и setattr? А то помню только магические методы с таким названиям

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

      да, оговорился, спасибо!

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

      @@selfedu_rus а на 2 вопрос можете ответить? А то я не помню где и когда речь шла именно о функциях getattr и setattr?

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

      @@Pro100Fart я тоже не помню уже, посмотрите по сайту: proproprogs.ru/python_oop

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

      Ответ на второй вопрос, #9 видео свойства, декоратор property посмотри в плейлисте. Там и упоминается насколько я помню

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

    Сергей, дайте, пожалуйста, ссылку на практические примеры. Очень нужно закрепить материал.

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

      ссылка под видео, курс на Stepik

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

    Здравствуйте, извиняюсь за не скромный вопрос. На какой самой высокой должности вам удалось работать? Спасибо за уроки!

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

      руководитель проектов

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

      @@selfedu_rus спасибо)

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

      Да, все верно! Здесь дескриптор лишь создает локальный атрибут в объекте Point3D и позволяет управлять с ним через объект класса Integer. Так принято делать и цели что-то жестко запретить программисту здесь нет. Одно нижнее подчеркивание лишь показывает, что переменная внутренняя, защищенная и если программист будет обращаться к ней напрямую, то могут быть проблемы. Если он все же это делает, то, как говорится, его проблемы, его предупреждали ))

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

      Хороший вопрос! Единственное при обращение к pt._x мы обращаемся к локальному свойству экземпляра класса Point3D, поэтому никакого взаимодействия с дескриптором не происходит, если я правильно понял первый вопрос. Во втором случае мы можем безопасно работать с локальными свойствами экземпляра класса Point3D только через дескриптор pt.x, а в случае прямого обращения к приватному свойству pt._x, то возникают риски из-за обращения к приватному свойству вне класса.
      Сергей, поправьте, если я в чем-то ошибся.

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

    Спасибо!

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

    эх) посмотрел пару раз, понял для чего нужно, но не разобрался как работает(

  • @ИванПанчишин-б5ь
    @ИванПанчишин-б5ь Год назад +1

    В документации питона написано, что при удалении дескриптора вызывается __delete__(self, instance), а не __del__(self), как показано на слайде

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

      ok

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

      ​@@selfedu_rus, и зачем вы вводите людей в заблуждение, интересно? Метод __del__ вызывается только в том случае, если он определен; но по умолчанию объект не содержит данный метод, а значит и утверждение ваше содержит только часть правды, а значит, что и в целом является неверным. Оператору del достаточно будет только наличия метода __delete__ для удаления дескриптора. И в конечно счете, комментарий выше больше был о том, что в вашем видео говорится в целом о протоколе дескриптора, но при этом приводится метод, который к данному протоколу никакого отношения не имеет (вместо того, который на самом деле там должен был быть). В данном случае слайд и пояснение к нему совершенно точно содержат ошибку, так что ваш ответ о том, что метод __del__ тоже вызывается при удалении, здесь абсолютно неуместен.

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

    подскажи пожалуйста, не могу понять несколько вещей.
    1. как работают функции в классе Integer, если мы их не вызывали.
    2. зачем в __set_name__ и в классе __get__ нам owner, если мы его не используем?

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

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

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

    А вот такой вопрос, как инициализатор обращается к свойствам класса x = Integer()? Ведь в его первой строчке перед именем 'x' стоит self, а ведь self тем самым формирует локальное свойство x со значением аргумента x, и никакого вызова или обращения к свойству класса x = Integer нет мы ведь не пишем Point3D.x(непосредственное обращение к свойству)

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

      Приоритеты разные, у обычных локальных атрибутов - наименьшие, дескрипторы более высокий имеют.

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

    Кстати, а для чего при создании дескрипторов, к их названиям прибавляются нижние подчёркивания? Спасибо Сергей

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

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

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

      @@selfedu_rus спасибо

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

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

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

      Дескриптор - это управляющая структура, а не конкретное значение. То есть, мы его сначала создаем (в целом, как объект), а затем, через этот объект можно назначать и считывать величины, которые будут заноситься в объекты, из которых они вызваны.

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

    Если я правильно понял, метод verify_coord спокойно можно сделать и @staticmethod

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

    Полезная штука , код сократил 116 строк до 56

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

    если я правильно понимаю, то в методе __get__ будет выполняться type(instance) == owner, но тогда непонятно зачем передавать owner в качестве параметра. Единственное что приходит в голову - при вызове дескриптора из класса owner непосредственно, без создания instance. Типа Point3D.x = 10. Или я что-то напутал

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

      наверное, на всякий случай, вдруг кому то нужно будет )

  • @фыввыфвпавпавп
    @фыввыфвпавпавп 2 года назад +1

    каким блин образом в сеттере дескриптора integer подставляется значение для аргумента value, откуда это значение берется? в данном примере сеттер получает значения x y z, которые передаются при создании экземпляра класса Point3D, как?. Где можно прочитать про эту логику дескрипторов?

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

    спасибо

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

    Перепутал метод __getattr__ с функцией getattr(), чуть мозг не сломал.... =)

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

    У меня вопрос по обучения. Достаточно смотреть ваши уроки или необходимо все списывать с них?

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

      Это вопрос к Богу )) У каждого все индивидуально!

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

    Вопрос, почему verify_coord обёрнут декоратором classmethod, а не staticmethod? Ведь в работе этого метода не используется переменная cls и ему не нужен доступ к классу?

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

      да, здесь вполне подойдет статик

  • @ИльмирШарифуллин-щ7т
    @ИльмирШарифуллин-щ7т 2 года назад +2

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

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

      мы переопределяем функцию, поэтому должны соблюсти ее сигнатуру

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

    Но разве параметр owner не является ссылкой на класс из которого вызывается дескриптор?

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

      Да, поэтому в видео в кадре написано: "Внимание: owner - ..."

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

    Возникает логичный вопрос :) если дескрипторы используются на практике нечасто и у нас есть 10 локальных свойств и не хочется (не можется) писать дескрипторы, то придется писать 30 методов (геттер, сеттер, делитер)?

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

      Можно даже их вынести в отдельный базовый класс (миксин) и подключать по мере необходимости. Правда в такой простой реализации этот класс будет жестко связан с набором локальных свойств дочернего класса.

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

    Спасибо большое за урок, но тема очень сложная. 😔😔

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

    Я будто выучил древнюю магию

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

    Зачем в __set_name__ конкатенация "_" + name? Просто для отображения в коллекции? Или всё-таки это указание на то, что свойство защищено?

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

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

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

      @@selfedu_rus Хорошо, понятно, а вот насчёт двойного подчеркивания "__" - оно используется для обозначения private свойства?

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

      @@sogorich да

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

      @@selfedu_rus Привет, Сергей! Вроде ошибка RecursionError будет, нет? Поэтому одно нижнее подчеркивание ставим, хотя можно что угодно поставить.

  • @ИванБережный-т9з
    @ИванБережный-т9з 2 года назад +2

    Приветствую 🖖
    Отличный у вас канал, столько полезной инфы, а главное все понятно. Но вот не нашел у вас ответа, и в интернете не смог найти.
    Если у меня асинхронно запущен loop, который исполняет какие-то действия до тех пор пока его не отключат. Отключаю его я комбинацией ctrl+c. Есть ли возможность передать данные в запущенный loop извне? Например передать ему команду stop()

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

      Спасибо! Сам не знаю. Это у ребят надо спросить )

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

    Здравствуйте, большое спасибо за уроки! Хотел написать, что ссылка в соответствующем уроке на Вашем сайте ведет не на этот ролик.

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

      Спасибо, поправил!

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

    Привет, Сергей! Можешь, пожалуйста, более детально объяснить, когда применяется декоратор @classmethod? Например, по твоей функции verify_coord видно, что она не использует атрибуты класса и даже атрибуты самого экземпляра, то есть нет необходимости ссылаться на какой-либо объект. Это больше похоже на вспомогательную функцию, к которой нужно применить декоратор @staticmethod.

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

      Здесь нет строгих критериев. Я больше интуитивно так сделал, т.к. эта функция для внутренней работы с методами класса. Декоратор @staticmethod по мне лучше применять для вызова функции из вне класса, например, для пересчета координат из одних единиц в другие или что-то подобное, что требуется за пределами класса, но при этом берется функция из области видимости класса. А вообще это через практику постигается. Увидите как другие делают, так и вы будете )

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

    Ой, пойдёт! 😄👍

  • @SEOdude-h5l
    @SEOdude-h5l Год назад

    На изображении на 17:20 non-data descriptor descriptor это класс содержащий только геттер.
    На 19:36 класс ReadIntX превращается в non-data descriptor посредством добавления сеттера.
    В связи с чем, у меня возникает некоторое недопонимание какой дескриптор всё таки является non-data, а какой data. И какой у кого приоритет.

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

      Я оговорился, на 19:36 мы превращаем в дескриптор не данных.

    • @SEOdude-h5l
      @SEOdude-h5l Год назад

      @@selfedu_rus подскажите, пожалуйста, правильно ли я понимаю, что для non-data descriptor нет необходимости в методе __set_name__ ? Т.е. такой дескриптор может иметь только лишь метод возвращающий значение.

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

      @@SEOdude-h5l set_name служит для задания имени атрибута, которое возвращается. Если такой механизм не нужен, то set_name можно не прописывать.

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

    Уроки огонь! Не могу понять, как описать __del__ в самом дескрипторе?

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

      __del__ это финализатор, в дескрипторах используются __delete__

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

    почему перезалив? были ошибки?

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

      да, параметр owner неправильно объяснил )

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

    Зачем использовать classmethod для проверки? Можно же использовать staticmethod. PS: спасибо за урок!

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

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

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

      @@selfedu_rus на мой взгляд тоже лучше использовать static, т.к. код метода не связан ни с классом, ни с его экземплярами и незачем тратить лишние ресурсы передавая в метод ссылку на класс или экземпляр

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

    Добрый день, а можете прокомментировать на 16:00, почему обращение через getattr и setattr более корректно с точки зрения python? Почему не стоит обращаться через коллекцию?

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

    Здравствуйте!
    Спасибо за Ваши видео, очень познавательно и полезно. Есть вопрос:
    если из метода дескриптора __set_name__ убрать "_" в строке self.name = "_" + name (то есть оставить self.name = name), то выпадает исключение о достижении лимита глубины рекурсии. Почему?
    UPD:
    Кажется, разобрался:
    При создании экземпляра без "_" получается рекурсивная ссылка внутри класса Point3D: метод __set_name__ бесконечно вызывает х, а х ссылается на Integer(). Честно говоря конкатенация в данном случае выглядит как костыль. Есть-ли способ сделать чуть опрятнее?

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

    запоминать 1 число просто, а милион не то-что громоздко, а сложхо

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

    При всем уважении, если "валуе", то уж и "наме" и "инстанце".

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

    Время - 6 м. 27с.
    Цитата - "второй параметр это ссылка на сам класс Integer"
    Второй параметр "owner" указывает не на класс Integer, а на класс Point3D, специально проверял, если в __set_name__ добавить print(owner), то выдаст -

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

      я ж там поправил и ниже текст гигантскими буквами про класс Point3D!

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

      @@selfedu_rus Действительно. И ведь пересматривал не один раз, пытаясь вникнуть, а всё равно мимо прошло. Пока вы не сказали, в упор этой надписи не замечал, мозг был сконцентрирован на стрелочках.

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

    👍

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

    можно ли такое повторить с приватными атрибутами?
    UPD
    Да, можно

  • @RS-mp5rp
    @RS-mp5rp Год назад +1

    И ни слова о магическом методе set_name! Откуда он взялся, для чего... Оказывается, он был включен с версии 3.6 и вызывается автоматически при создании класса. Для новичков это тоже нужно пояснять, а то будут без понимания копипастить.

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

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

  • @ДмитроКуценко-у6б
    @ДмитроКуценко-у6б 11 месяцев назад

    @selfedu_rus Является ли нормальной практикой использование одного дескриптора данных для нескольких классов?
    Например, у нас есть классы Picture, Mummies, Papyrus, и мы хотим проверить каждый локальный атрибут экземпляра класса на соответствие строковому типу данных перед присвоением значения атрибуту.
    Можем ли мы создать один и тот же дескриптор данных (например, StringValue) для всех них?
    Спасибо.

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

    great

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

    Спасибо огромное за уроки по питону на степике и за ваши труды. вы очень мне помогли с обучением. Сейчас изучаю питон активно очень. по многу часов в день и просыпаюсь по будильнику и дальше учу.мой интерес к программированию на твердую 4. В целом есть большой интерес к разработке игр, очень большой на уровне фанатизма. Я уже ковырял файлы от майкрафта и террарии. хотел мод свой слепить. но знаний ноль. поэтому начал с питона сейчас. хотя понимаю что он не очень подходит для разработки игр и порой я думаю а туда ли я иду ?.. Но Веб разработка в принципе тоже интересна, и заказов будет явно больше чем на игры. наверно с неё и начну. после обучения основ буду учить django и flask. надеюсь это верное решение. ( хотя здесь выбор видимо между тем что нравится и реально нравится )

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

      Как успехи?

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

    Сергей также вопрос я с данным способом могу обращаться к атрибуту с режимом доступа private. То есть мне не составляет труда написать print(self._ _x) и мне выдаст ответ. Почему так?

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

      Когда вы в дескрипторе создаете как бы приватную переменную (с двумя подчеркиваниями), то находитесь вне класса, где она формируется, поэтому приватной переменной не получается, а создается некий аналог публичной переменной с двумя подчеркиваниями. В общем, в дескрипторах принято создавать защищенные (protected), а не приватные переменные.

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

    Спасибо. Но с первого раза не дошло.

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

    с 6:20 вы говорите что self - это ссылка на создаваемый экземпляр класса, а стрелочку ведете на атрибут 'x' класса 'Point3D'. Можете пояснить, что не так?

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

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

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

    а почему Вы метод verify_coord сделали методом класса? В нем ведь никаких атрибутов класса мы не используем, у нас вообще их нет. Может лучше его сделать статическим? Спасибо за уроки)

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

      да, лучше статическим, согласен!