#9. Свойства property. Декоратор @property | Объектно-ориентированное программирование Python

Поделиться
HTML-код
  • Опубликовано: 28 ноя 2021
  • Курс по Python ООП: stepik.org/a/116336
    Добавляем объект-свойство property в класс для работы с приватными локальными свойствами экземпляров классов. Что это такое и зачем нужны. Создание свойств через декоратор @property.
    Плейлист по Python ООП: • Объектно-ориентированн...
    Инфо-сайт: proproprogs.ru/python_oop
    Telegram-канал: t.me/python_selfedu
    Введение в декораторы функций: • #45. Введение в декора...

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

  • @user-jc2dv3ht8n
    @user-jc2dv3ht8n Год назад +37

    у Вас талант к преподаванию, весь материал излагаете последовательно и доходчиво

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

    Если кому-то сложно освоить материал, что-то не получается, то лучше отдохнуть и вернуться к этому уроку через время
    Это должно помочь

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

    Скорее всего вопрос, который я задам, опытным коллегам покажется максимально глупым, однако мой жизненный опыт говорит о том, что лучше показаться глупым в обучении, чем оказаться глупым в "бою".
    Посему вопрос: для чего сначала запрещать доступ к атрибутам извне посредством присвоения им статуса private, а потом достаточно хитрым методом реализовать через декоратор в классе возможность обеспечить доступ к этим же самым атрибутам опять-таки извне? Если не сложно, не могли бы описать какой-нибудь пример из реальной практики, когда это необходимо?
    Заранее большое спасибо за ответ и огромное уважение и благодарность автору за этот замечательный курс!

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

      Спасибо! Классический вопрос. Пусть есть класс Window - окно на экране. У него есть два свойства height и width (высота и ширина), мы создаем объект w = Window(), а затем, меняем высоту w.height = 200. Что должно произойти при этом действии? Во-первых, измениться соответствующее свойство (с проверкой корректности данных) и, во-вторых, измениться в размерах само окно на экране. Сделать это через обычную переменную с доступом извне не получится.

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

      Дмитрий! Я, как и Вы - учусь и точно также оочень длительное время задавался именно этим вопросом... пока не понял его полностью! Если Вас не устроил ответ Учителя - могу Вам предложить обьяснение от себя-Чайника... ) может Вам легче будет понять - как художник - художника...)

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

      Я думаю что можно впихнуть какие то проверки или действия перед передачей или записью

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

      @@andrewharazdowskyy4771 я не Дмитрий, но был бы рад еще одному объяснению

    • @andrewharazdowskyy4771
      @andrewharazdowskyy4771 2 года назад +52

      ​@@maksshcherbakov8533 Макс! Мне лично хорошо запоминаются жизненные примеры. Допустим мы с Вами пишем комплекс для проектирования мебели. Запоминаем: для производства мебели нам поставляют плиты размером 2 х 3 м и допустим - одинаковой толщины - 20 мм. Вы - пишете модуль для подсчета расхода материала (наших мебельных плит). Вы создаете класс Plate (плиты) c локальными свойствами x, y, z (ширина, высота, толщина). Каждый раз - когда я создаю экземпляр Вашего класса (это значит - я отрезал кусок плиты) - Вы делаете расход материала. А теперь Главное: если свойства x, y, z будут public - я могу создавать экземпляры (отрезать куски) размером больше допустимого... и даже по ошибке - могу заказать кусок (попробовать создать экземпляр) a = Plate(1, "Hello", 30). Сделав все три параметра x, y, z - приватными - Вы можете перед каждым созданием экземпляра класса проверять в сеттере - на правильность типа (например только int), на соответствие допустимому диапазону (например - ширина до 3 м), можете запретить изменение параметра z - толщине (все плиты по договоренности - одинаковой толщины 20 мм). С одной стороны - у нас инкапсуляция - с другой стороны - модуль же должен иметь связь с внешним миром! Вот мое лично субьективное понимание сути вопроса. Попробуйте найти некоторые подтверждения моих мыслей в базовом (начальном) уроке по сеттерам и геттерам.

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

    Невероятно простая подача сложного материала все понятно! Спасибо!

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

    Сергей, спасибо за ваши видео!!!
    Просто супер!!!
    Самое комплексное и понятное объяснение!!!
    Все ваши видео смотрю!!!

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

    Как же шикарно все объяснено, просто по полочкам. Респект!!!

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

    ты просто гениально все объясняешь ! спасибище!!!

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

    Наконец-то нормально объяснили как это все работает. Спасибо!

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

    Отличный урок, все просто и понятно..Спасибо большое !

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

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

    • @leshen_show
      @leshen_show Год назад +21

      Сергей, мы вас рассекретили, разлогиньтесь)

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

      @@leshen_show не, а что? бизнес, ничего личного! А так Сергею огромное спасибо за курс))

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

      Є ще egoroff_channel

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

    Пошла жара ))

  • @ned.sergio8454
    @ned.sergio8454 5 месяцев назад +1

    Спасибо! Очень понятно объясняете, сразу всё ясно

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

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

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

    Хороший и полезный ролик 😌 как дойду до наследования дам свой полный фидбэк на обновленный курс по ооп😌 но в любом случае сразу благодарю автора!!!!видно что работа огромная проделана

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

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

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

    Спасибо. Про декораторы знал, но то что это методы класса property - это нигде не разу не встречал. Было интересно посмотреть как это работает изнутри.

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

    спасибо за Вашу работу.

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

    Спасибо! Очень полезное видео!

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

    Автор, желаю тебе миллион подписчиков за втой труд!

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

    Потрясающе!

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

    спасибо тебе огромное, дорогой!

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

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

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

    Декоратор очень полезный, сокращает количество кода. Уже испробовал в модели Django проекта.

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

    Отлично, спасибо

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

    2.5 недели назад не понял, что такое декораторы в итоге прошел весь ваш курс на степике по питону. Вернулся и теперь все стало ясно.

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

      ссылку на курс можно?)

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

    Cпасибо за отличный курс. Если есть ещё здесь старички как я, то за шестёрёнкой на видео можно понизить скорость до 0.75, как я делаю ;)

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

    Очередной раз нашёл много того, чего не знал, спасибо!

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

    класс

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

    Спасибо!

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

    Проще гораздо работать напрямую через set и get, плюс добавив docstring
    Реализация через property существенно усложняет сопровождение кода

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

    спасибо!

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

    спасибо!!

  • @AM-vr6ej
    @AM-vr6ej 8 месяцев назад +3

    все супер, доступно и понятно. спасибо. но почему не Age, а Old?))

    • @andrus3125
      @andrus3125 5 месяцев назад

      how old are you

  • @eh9mjeh9mj
    @eh9mjeh9mj 4 месяца назад +2

    до ООП я считал что python действительно легкий язык

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

    У меня пиявились знания )

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

    Нормально! На других каналах, где повествуется эта тема, вообще ничего не понять.

  • @gayratsaidakhmedov5451
    @gayratsaidakhmedov5451 4 месяца назад

    спасибо

  • @mihailamurov8575
    @mihailamurov8575 11 месяцев назад +2

    Не пойму чем простые геттеры и сеттеры 02:30 уступает этому 04:42 (property(get_old, set_old)) и уж нем более чем 13:26 (@property + @get_old).
    Последнее ну ни разу не выглядит проще и интуитивнее.
    Или я что-то не понимаю?

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

    Пора изменить название канала на Супер препод!

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

    Стільки інфи в 16 хв. Сергей в ударі!

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

    Спасибо. Понятно. Странно только - пользуемся вроде абстракцией в виде класса, но лезем ей в кишки (совсем не абстрактно).

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

    Я правильно понимаю, что это нужно для того, что бы если мы заранее не знаем имя нового атрибута мы таким образом защищаем от изменений важные для работы класса атрибуты? Ну т.е. если пользователь в последствии создаст экземпляр класса, добавит в него атрибут old, то это никак не повлияет на атрибут самого класса. Таким образом у нас не пересекаются имена атрибутов и при желании можно изменить атрибут old самого класса, а не его экземпляра?

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

    Отличное видео! Но остались вопросы. Ваш пример с Window (приведённый под другим комментарием). Нельзя ли вместо property использовать магический метод __set_attr__, в котором мы будем проверять, какое свойство мы изменяем, и если это width или height, то, соответственно, делаем то что надо. Заранее спасибо)

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

      Можно, но property позволяет разнести код по отдельным методам, что с точки зрения красоты куда лучше.

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

      Спасибо, буду знать

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

    Спасибо ! В отличии от урока в предыдущем курсе по ООП этот действительно более понятен, посмотрел с удовольствием! )
    Однако хочется прояснить один момент:
    В классе когда мы делаем свойства через декораторы...
    old = property()
    old = old.getter(fun)
    old = old.setter(fun2)
    Правильно ли я понимаю, что здесь происходит как бы 'напихивание декорированных методов в переменную - old' т. е это не нужно воспринимать как обычное присваивание.
    Имею в виду, что если бы имя - 'old' не было объектом property то такое присваивание каждый раз связывало бы с этим именем новый метод.
    Какой-то протокол под капотом ?

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

      Да, все верно, old - это общий декоратор, в котором будет два метода для setter и getter

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

      @@selfedu_rus спасибо.

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

    👍

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

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

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

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

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

    Добрый день!
    Спасибо за вашу работу. Прошу ответить на пару вопросов, если Вас не затруднит.
    1) Подскажите, декоратор @property обязательно только перед геттером стоит ( 14:25 )? И почему именно перед ним? Исторически сложилось?
    2) В каком случае возможно использование декоратора @old.getter ?
    Заранее благодарю!

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

      Возможно, это восходит к дескрипторам (данных и не данных), где метод get() строго обязателен. А, вообще, следует воспринимать как элемент языка и просто запомнить.
      Этот декоратор можно использовать для переопределения геттера.

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

      @@selfedu_rus но даже при переопределении геттера, декоратор property будет у "старого" геттера?

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

      @@v_alik Вот, переопределется:
      class Person:
      def __init__(self, name, old):
      self.__name = name
      self.__old = old
      @property
      def get_old(self):
      return self.__old
      @get_old.setter
      def get_old(self, old):
      self.__old = old
      @get_old.getter
      def get_old(self):
      return self.__old + 10

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

      @@selfedu_rus Тогда
      @property
      def get_old(self):
      return self.__old
      перестает быть геттером? и тогда зачем он остался, почему бы не стереть?

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

    Дорого времени суток, видео 🔥. Но есть вопрос: если сделать не __age, a age, то выходит ошибка, связанная с рекурсией. Можете пожалуйста объяснить почему?

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

    Спасибо за видео, все очень понятно, но есть вопрос: можно ли таким образом в сеттер передать два значения?
    Допустим у на с класс Poіnt, у точки две координаты, можно через @property задават два значения?

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

      да, можно, например, через кортеж

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

      @@selfedu_rusспасибо, сработало

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

    Немного не понял вот этого:
    old = property()
    old = old.setter(set_old)
    old = old.getter(get_old)
    Разве мы каждой строчкой не переопределяем атрибут old?

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

      Тоже обратил на это внимание. Мой уровень знаний пока не позволяет понять как работает данный объект. Что происходит при вызове экземпляр класса old? Как он сам определяет какой метод вызвать...

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

    День добрый, уважаемый Сергей есть вопрос. А property в 5 подвиге нам пришлось как бы дублировать отдельно для width и height тоесть получилось для одного сетер и гетер и для другого сетер и геттер а нельза было для двух обьектов-свойств записать один геттер и сеттер или для каждого объекта свойства должен быть отдельный геттер и сеттер?

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

      Можно и одно, тогда передавать придется сразу два значения как кортеж и читать тоже в виде кортежа.

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

    етишкин кот!

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

    Добрый день! Подскажите пожалуйста, почему вот такая ошибка.
    Если один аргумент в сеттере то все ок, если два то такая ошибка..
    Traceback (most recent call last):
    File "/Users/maxvolkoff/PyPro/teach_n0/classes_4.py", line 18, in
    pt.min_max = (1, 2)
    TypeError: Class.min_max() missing 1 required positional argument: 'max'

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

      вот такой вот код:
      class Class:
      def __init__(self, min, max):
      self.__min = min
      self.__max = max
      @property
      def min_max(self):
      return self.__max
      @min_max.setter
      def min_max(self, min, max):
      self.__max = max
      self.__min = min
      pt = Class(0, 10)
      pt.min_max = (1, 2)
      print(pt.min_max)
      print(pt.__dict__)

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

      эту конкретику лучше спрашивать в сообществе телеграм-канала по Python (ссылка под видео)

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

    с 3 - го раза понял и освоил тему ахах

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

    Сергей, можно ли через property setter изменять два атрибута одновременно, например имеем две стороны прямоугольника А и В. В примере у Вас нужно делать свойство на каждый атрибут, а чисто логично бы сделать одной свойство к на обе стороны прямоугольника... Спасибо заранее.

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

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

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

      @@selfedu_rus а Вы не могли бы кусочек такого кода на обозрение представить, пожалуйста))

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

      class Rectangle:
      def __init__(self, *nums):
      self.__a = nums[0]
      self.__b = nums[1]
      self.__area = None
      @property
      def area(self):
      if self.__area == None:
      self.__area = self.__a * self.__b
      return self.__area
      @property
      def Rect(self):
      return self.__a, self.__b
      @Rect.setter
      def Rect(self, nums):
      self.__a = nums[0]
      self.__b = nums[1]
      self.__area = None

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

      @@Grigorev84
      Подскажите, пожалуйста, почему в сеттере вы используете nums, а не *nums?

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

    Рекомендую тем кто в замешательстве, как был я паралельно клацать в пайчарме и пробовать, а то столько всего в ООП что уже теряешь себя в пространстве)

  • @user-kc2ib3md8y
    @user-kc2ib3md8y 2 года назад

    Добрый день, Сергей. Подскажите, вы планируете этот курс загружать на Stepik?

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

      Пока нечего загружать ) Проработка курса - это около месяца упорной, рутиной работы. Сейчас не до этого.

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

    Добрый день.
    Вопрос, касающийся свойства property.
    Правильно ли я понимаю, что имеет значение порядок методов, указанных в свойстве property:
    на первом месте всегда метод, обеспечивающий получение значения атрибута,
    на втором - метод для задания значения атрибута,
    на третьем - метод для удаления значения атрибута,
    на четвертом - строка, содержащая документацию?
    property(getx, setx, delx, "I am the property.")
    И при изменении значения атрибута интерпретатор понимает, что необходимо вызвать метод, указанный на второй позиции свойства property,
    при зачитывании значения атрибута - метод, указанный на первой позиции свойства property
    и т.д. ?

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

      вроде, да, верно расписали

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

    9:12 так old приняло значение строки, хорошо. Но ведь в __dict__ осталось _Person__old = 20, которое ещё конструктор создал.
    Выходит, там оказался такой вот скрытый атрибут что ли?

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

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

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

      @@selfedu_rus т.е. при обращении к любому атрибуту экземпляра (даже если самое обычное, без свойства) интерпретатор сперва заглядывает в класс на случай, если там есть одноименное свойство? Это я к тому: а как иначе интерепертатор знает про свойство, заглядывая **сперва** в поля экземпляра?

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

      @@Army_of_Earth да именно так

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

    воистину неисповедимы пути создателей питона. Все такие удобные-юзабильные, но при этом размазывают свойство декоратором на 2 метода. А если мамкин программист геттер в начале класса определит, а сеттер двумя экранами ниже?) И ищи свищи его потом))
    Не удобнее ли будет через лямбды делать name = property(lambda n:....) ?

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

      в каждом конкретном случае нужно смотреть, что проще и удобнее

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

      Если ты видишь, что существует геттер, значит, должен предполагать, что существует и сеттер. И наоборот. Поск - дело 3х секунд.
      "Не удобнее ли будет через лямбды" => судя по тому, что этот вопрос прозвучал, ты даже не пробовал воплотить это в реальном коде. Ты ж не какой-то там "мамкин программист"

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

      @@Army_of_Earth я щас маму позову, она тебе за такие слова в чулан под лестницей запрёт.
      И да, не пробовал, конечно) Иначе бы я не интересовался туторами для новичков

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

      @@Army_of_Earth " должен предполагать"
      Никто ничего не должен предполагать, особенно в программировании, где надо максимально разгружать голову от лишней информации

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

      @@Natural_Mindset так а к чему был перл про "мамкиных программистов"? Тему надо изучать, п-е-ч-а-т-а-я код, а не смотреть ролики как мыльную оперу. Это то, что отличает "мамкиных программистов" от людей, желающих развиваться.
      Поступи ты правильно - этого вопроса в принципе не возникло бы. Речь же не идет исходный код самого Питона. Тесты делаются за 5-10 минут, заодно материал закрепляется, делаются предположения/утверждения, находятся ошибки и уязвимости.

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

    Почему когда мы обращаемся к сеттеру, через оператор присваивания = происходит вызов функции. У меня одно объяснение он переопределен в классе property и выполняет другое действие как скобочки (). По аналогии с переопределением __add__, когда + будет делать заданный функционал а не сложение/конкатенацию. Я прав?

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

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

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

    Спасибо! А если всё то же самое нужно и для переменной __name, то неужели придётся дублировать код?

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

      Тоже очень интересует. Я попробовал продублировать декораторы для переменной __name и значения переменных в консоли стали равны (__old == __name ).

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

      Только def old надо менять на def name. @property def name(self); return self.__name; @name.setter def name(self, value); self.__name = value

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

      @@TheLazyEagle собственно, я так и предполагал, что не есть круто, по моему мнению.

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

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

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

      @@gienek_mscislawski Ну да, если очень много приватных переменных, то код начинает расти.

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

    Сергей, не совсем понял на 7:37 речь же идет о локальных атрибутах, а не о локальных свойствах или не так?

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

    Здравствуйте, много где облазил - ничего не нашел. Надеюсь вы ответите.Почему мы не можем просто сразу создать метод private, почему нужно создавать публичный, а потом в нем делать return private. Вот допустим:
    @property
    def lvl(self):
    return self.__lvl, f'{dt.now() - self.__born}'
    @lvl.setter
    def lvl(self,numer):
    self.__lvl += numer
    Почему нельзя сразу создать def __lvl(self)?
    Заранее спасибо!

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

      приватные атрибуты - это служебные (как правило, переменные) внутри класса и менять их извне не предполагается. Но если все же нужно получать или менять их значения, то прописывают сеттеры/геттеры или объекты-свойства, где выполняют дополнительную проверку на правильность передачи значений. Подробнее вам могут ответить в телеграм-канале по Python.

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

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

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

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

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

      Ну во-первых, ту же логику расширить на protected аргументы. Во-вторых в этой же логике вы можете докрутить дополнительные проверки, эксепшны и так далее

  • @viv81ster
    @viv81ster Год назад +5

    После стиля C# стиль ООП пихтона смотрится конечно дико

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

    Теория эволюции инкапсуляции в питоне за 16 минут))))

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

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

    • @user-tq7vl5zr2k
      @user-tq7vl5zr2k 2 года назад

      Первые два видео как раз об этом

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

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

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

      см. курс по Django и Flask - там они на каждом шагу ))

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

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

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

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

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

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

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

      @@selfedu_rus спасибо! нужно практиковать

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

    спасибо) но если можно чуть помедленнее

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

    Получается, к методам с одинаковым именем применяются разные декораторы, которые делают из метода объект property. Интерпретатор понимает какой метод исполнять, в зависимости какой оператор был использован: оператор присвоения - setter, оператор del - deleter, без оператора - getter?

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

      имя метода - это лишь ссылка на объект-функцию класса, поэтому все эти ссылки просто сохраняются в декораторах.

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

      @@AntonyKondr я имел ввиду при вызове в глобальном пространстве имен

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

      ​​​@@zakirovio вероятно тут все завязано на сигнатуры.
      Вы можете без всяких классов написать кучу просто функций с одинаковым именем но разными аргументами на вход - интерпретатор посчитает их как разные функции и будет выбирать исходя из ситуации нужную.
      Рызные декораторы над объявленной функцией так же меняют сигнатуру, получается похожая логика

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

      @@lemonade0224при определении множества функций с одинаковыми именами, вызываться будет только последняя, ее область видимости будет перекрывать другие

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

      объект класса property скорее всего имеет доступ к ссылкам этих одноименных методов и при использовании определенного оператора или инструкции применяет setter. getter или deleter

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

    Зачем делать два различных сеттера и геттера для двух приватных атрибутов? Разве мы не можем изменять и получать их оба через один сеттер/геттер?

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

    Не понял этого
    old = property()
    old = old.setter(set_get)
    old = old.getter(get_old)
    Как там присвоение идет...

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

      Здесь нет никакого присваивания, всего лишь применяется декоратор setter к функции set_get и декоратор getter к функции get_old, чтобы обеспечить работу свойства old

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

    В чем смысл такого функционала? Приватизировать, потом создавать декораторы, чтоб обращаться к методам класса, в чем смысл можете объяснить, чтоб я понимал в чем была цель такой логики в классах?

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

    не увидел в прошлом видео объяснение гетеров и сетеров. Какое именно?

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

      вспомнил

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

      ruclips.net/video/RipfqbH0eqY/видео.html

  • @01011968Desgner
    @01011968Desgner Год назад +1

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

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

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

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

    Касаемо функционального дублирования. Почему бы вместо докорирования геттеров и сеттеров не сделать сами геттеры и сеттеры приватными, и передавать в объект property приватные геттеры и сеттеры?

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

    если честно - какого то облегчения так и не увидел. Вроде и без проперти всё прекрасно работает. Объём кода сильно не уменьшился

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

      удобство в дальнейшем применении класса, конечно, если property выполняет не банальное присваивание, а некий алгоритм

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

    Сергей, подскажите, если использовать property и не использовать атрибуты типа _ _private , то возникает ошибка так как у нас не будет присутствовать свойство , которое мы сделали с помощью property. К примеру у меня будет отсутствовать свойство health
    class Player:
    def __new__(cls, *args, **kwargs):
    print(f'Вызов метода __new__')
    return object.__new__(cls)
    def __init__(self,name, health, lvl):
    self.name = name
    self.health = health
    self.lvl = lvl
    @property
    def health(self):
    return self.health
    @health.setter
    def health(self, value):
    if value in (int,float):
    self.health = value
    # else:
    # raise TypeError('Здоровье должно быть написано цифрами')
    #
    p1= Player('Henry', 100, 5)
    print(p1.__dict__)
    print(p1.health) ---- > ОШИБКА

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

      Получается чтобы использовать объект свойство нужно чтобы свойства быти всегда или protected или private?

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

    Что такое объект свойства, в этой теме про него говорят, но я никак не могу понять

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

    Посмотрел 4 минуты и не понимаю, в чём практический/сакральный/иной смысл этих манипуляций?
    Сначала мы сделали атрибуты приватными, затем расприватили их, чтобы иметь возможность обращаться к ним.
    Для чего?
    print(class_name.__dict__) показывает все наши "приватные" данные
    Единственное, что удобно = old = property(get_old, set_old), как дальнейшее использование чтения/записи используя прдемонстрированный в видео подход.
    Но стоит ли оно того, чтобы каждый раз это прописывать?

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

    Зачем делать атрибут приватным, чтобы потом сделать пубоичным, каким он был изначально?

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

      Через property можно контролировать, что записываем и что отдаем.

    • @user-bm1yl7xi6l
      @user-bm1yl7xi6l 10 месяцев назад

      @@selfedu_rus благодарю

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

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

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

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

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

    Всего один сеттер и все, тебе уже 35

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

    все равно не понимаю, зачем мы запрещаем программисту обращаться к свойствам объекта напрямую:
    p.old
    а потом городим еще кучу строчек, чтобы он все-таки потом мог обращаться к свойствам объекта визуально и по сути будто напрямую:
    p.old
    Почему бы нам сразу не разрешить ему иметь доступ к свойству напрямую?

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

    Разве self.__name = name это локальное свойство а не приватный атрибут?
    ruclips.net/video/MxviMwbGl3I/видео.htmlm00s,

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

      это и локальное свойство и приватный атрибут )

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

    Вот эта конструкция не ясна
    old = property()
    old = old.setter(set_old)
    old = old.getter(get_old)
    Больно уж похоже на оверрайд одного и того же атрибута разными объектами

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

      BTW
      Вот такое вот
      old = property(get_old, set_old)
      Было бы понятнее

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

    одно через другое через третье, фиг знает что., А где бл... постулаты пайтона - явное лучше неявного, Простое - лучше сложного. вопрос - нахера тьак все усложнять , мало вижу пользы в этом все по итогу Только голову ломать

  • @Putiny_Pizda
    @Putiny_Pizda 5 месяцев назад

    Бесполезная хрень
    Только кода больше
    .
    Написали одно потом написали второе в итоге и то и другое есть.