#10. Пример использования объектов property | Объектно-ориентированное программирование Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 2 ม.ค. 2025

ความคิดเห็น •

  • @АртемНиконов-у7я
    @АртемНиконов-у7я ปีที่แล้ว +15

    Браво!!! Один из лучших курсов по ооп,лаконично,практично,без воды!

  • @Лена-в1н6ы
    @Лена-в1н6ы ปีที่แล้ว +6

    Спасибо огромное! Вы - талантливый учитель. Все по полочкам с акцентами на причины действий. Так материал воспринимается и усваивается, как вполне простой. Другие учителя больше "колдуют", пытаясь вызвать удивление. Удивляться не хочу, хочу учиться!

  • @jaksonmillka
    @jaksonmillka 3 หลายเดือนก่อน +1

    Урок #10 = Наконец-то пройден
    Засел на этом уроке, около часа. 2 раза пересматривал, чтобы точно все понять, и параллельно практиковался.
    Для себя понял, что все это время, очень сильно усложнял проверки, и в целом код, в своих псевдо проектах.
    Уже как-то начинается меняться логика с обычного знатока, который просто знает синтаксис, на реально похожего на разработчика. Спасибо Вам. Хоть и понимаю, что это даже не верхушка айсберга, но все же, начало положено :)

  • @aston585
    @aston585 ปีที่แล้ว +6

    Сергей Михайлович, огромное тебе человеческое 'спасибо'.upper() за понятное донесение знаний!

    • @sedoy_dedushka
      @sedoy_dedushka 4 หลายเดือนก่อน +1

      'спасибо'.upper() - это очень мощно xD

  • @tanyadiduk3640
    @tanyadiduk3640 ปีที่แล้ว +2

    Вы очень понятно и доступно объясняете! Я уже просмотрела ролики по ООП у другого автора на ютуб, при чем не бесплатно, и не всегда было понятно для чего оно и как использовать. Ваши видео не просто освежают знания, но и расставляют по полочкам то что недопоняла раньше. СПАСИБО ЗА ВАШ ТРУД!

  • @sega6574
    @sega6574 2 ปีที่แล้ว +9

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

  • @suslikest3708
    @suslikest3708 ปีที่แล้ว

    Отдельное спасибо за такой практический урок т к это помогает закрепить материал.

  • @erikdeveloper
    @erikdeveloper 2 ปีที่แล้ว +10

    Храни Вас Господь 🙏

    • @fedorevg7091
      @fedorevg7091 2 หลายเดือนก่อน

      Аминь.

  • @anb76ru13
    @anb76ru13 2 ปีที่แล้ว +25

    класные уроки! их бы еще в курс оформить на степике с практическими заданиями. и будет вообще бомба

    • @dmitriivanov7010
      @dmitriivanov7010 2 ปีที่แล้ว +3

      Теперь есть, го на степик

    • @anb76ru13
      @anb76ru13 2 ปีที่แล้ว +1

      @@dmitriivanov7010 уже)

  • @ДенисКрбнкв
    @ДенисКрбнкв ปีที่แล้ว +2

    Отличный пример! Спасибо! Понял не только проперти, а ещё классмедоды и вообще начал осознавать смысл ооп :D

  • @mjolnik
    @mjolnik 11 หลายเดือนก่อน +1

    Как будто бы начинаю что-то понимать. Спасибо)

  • @alexlutor72
    @alexlutor72 2 ปีที่แล้ว +2

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

  • @cinbek9371
    @cinbek9371 3 ปีที่แล้ว +2

    Мне очень нравятся твои видео, на обеде постоянно смотрю

    • @mrrototo761
      @mrrototo761 10 หลายเดือนก่อน +1

      Я тоже смотрела на обеде ❤

  • @СергейКириллов-ь9ю
    @СергейКириллов-ь9ю 3 ปีที่แล้ว +4

    Очередное классное видео. Очень все внятно-понятно.

  • @donfedor007
    @donfedor007 3 ปีที่แล้ว +7

    Спасибо за урок! Как всегда по красоте!

  • @ВадимСухотин-ю5д
    @ВадимСухотин-ю5д 2 ปีที่แล้ว +30

    Маленькое уточнение к тексту в районе 6-7 минут: список f получен с помощью метода split, поэтому он не может содержать пустые строки. Даже если попадутся два подряд пробела, они будут восприняты как единый разделитель. Таким образом, проверка на нулевую длину строки s явно излишня.

    • @Хакохо
      @Хакохо 11 หลายเดือนก่อน

      тоже это заметил, как ни вводи ФИО его придется либо ввести(чтобы не было ошибки), а если не ввести то возникнет ошибка из-за того что не указан аргумент, я правильно понял ?

  • @vladimirkulakov6126
    @vladimirkulakov6126 3 ปีที่แล้ว +3

    Спасибо за крутой практический урок! Натренировал, пальцы теперь помнят)

  • @tranklukatorz
    @tranklukatorz 3 ปีที่แล้ว +2

    Мое почтение за ваши труды!!

  • @Ruslan501
    @Ruslan501 8 หลายเดือนก่อน

    Маэстро, отличное объяснение. Отличный пример!

  • @andredru4278
    @andredru4278 10 หลายเดือนก่อน +1

    Спасибо. Уже привык к понятным объяснениям.

  • @vlakin1
    @vlakin1 3 ปีที่แล้ว +2

    Как здорово что я Вас нашел :-)

  • @a_n_gel-j6m
    @a_n_gel-j6m 2 ปีที่แล้ว +2

    Супер!! Спасибо! Теперь все по полочкам разложилось))))

  • @sergeigaribzyanov6061
    @sergeigaribzyanov6061 2 ปีที่แล้ว +2

    Я в восторге!!! Огромное спасибо тебе!

  • @python_95
    @python_95 3 ปีที่แล้ว +2

    давно ждал таких уроков. Спасибо большое

  • @nailnail1000
    @nailnail1000 2 ปีที่แล้ว +3

    Спасибо, Сергей, за крутой урок!

  • @Lex12243
    @Lex12243 2 ปีที่แล้ว +2

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

  • @ОлегТруе
    @ОлегТруе 3 ปีที่แล้ว +1

    Ваши классы просто класс 👍

  • @kirkarimov1418
    @kirkarimov1418 ปีที่แล้ว +5

    Сергей, всё очень здорово. Писал раньше только линейно в ООП перехожу вместе с вами.
    несколько незначительных ремарок(для новичков в программировании они могут быть полезны):
    1. Возраст на английском "age" (old - это прилагательное "старый"... мне на протяжении ролика очень сильно резало слух)
    2. C точки зрения хранения таких данных, корректнее хранить дату рождения, а возраст рассчитывать от ДР
    3. Если будет введен вес целым числом - это же не ошибка... ;)

    • @Работа-н9в
      @Работа-н9в 6 หลายเดือนก่อน

      Стоп, а почему "How old are you?', когда спрашивают про возраст?

    • @estelliarONE
      @estelliarONE 5 หลายเดือนก่อน +1

      @@Работа-н9в По сути вариант с "How old are you?" - Подразумевает "Насколько ты стар(а)" - Просто прижилась такая формулировка. Но ещё используют и вариант по типу: "What's your age?" но гораздо реже первого

    • @sedoy_dedushka
      @sedoy_dedushka 4 หลายเดือนก่อน +1

      по поводу 3 пункта тоже так подумал и использовал при проверке if not isinstance(weight, (int, float))

  • @sofiipochta
    @sofiipochta 4 หลายเดือนก่อน +2

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

  • @he4esystem494
    @he4esystem494 ปีที่แล้ว +1

    Отличный урок. Спасибо!

  • @alexanderg9089
    @alexanderg9089 2 ปีที่แล้ว +1

    Отлично показаны best practices , да еще на пальцах. Спасибо! Сергей, понимаю, что это примеры обучающие примитивные. Но можно предлагать альтернативные варианты проверок для самостоятельного обучения. Например проверку допустимых символов через множества. Форма серии номера паспорта через регулярные выражения. Реализовывать не надо, просто пометку ....тут можно по другому, это задание на 5+, кто чувствует силы попытайтесь сами, нет - пропустите.

  • @ISAWER1
    @ISAWER1 ปีที่แล้ว +1

    лайк и комментарий в поддержку канала

  • @web4453
    @web4453 2 ปีที่แล้ว +1

    спасибо! живите 100 лет

  • @freeforrussia
    @freeforrussia 3 ปีที่แล้ว +1

    Спасибо, давайте ещё про классы!

  • @андрейхоменко-и5я
    @андрейхоменко-и5я 3 ปีที่แล้ว +1

    Браво... Прекрасный материал...

  • @aleksandrsemenov1764
    @aleksandrsemenov1764 2 ปีที่แล้ว +9

    Самое сложно было понять, почему в конце убрали __ перед свойствами.
    self.item внутри __init__ - это имя нашего объекта property. То есть мы просто вынесли присваивание self.item = __item в сеттер.

    • @ymnop9652
      @ymnop9652 2 ปีที่แล้ว +3

      Я правильно понял что скажем с примером old. self.old = old эта команда вызывает сеттер @old.setter в котом и проходит проверка? И это всё происходит потому что у сеттера приоритет выше?

    • @ivanivanovich975
      @ivanivanovich975 ปีที่แล้ว +1

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

  • @Developer_python_
    @Developer_python_ ปีที่แล้ว

    За последний штрих особый лайк-думал скажете или нет))))

  • @gta_KaskaD
    @gta_KaskaD 3 ปีที่แล้ว +2

    Супер, спасибо большое.

  • @nik01aich
    @nik01aich 2 ปีที่แล้ว +1

    четко и по делу!

  • @AS-th7xe
    @AS-th7xe ปีที่แล้ว +2

    Здравствуйте, вопрос: а где идёт проверка возраста, веса, паспорта мы же не используем атрибуты класса, не лучше ли использовать staticmethod?

  • @Watcherfromfar
    @Watcherfromfar 10 หลายเดือนก่อน +1

    Спасибо большое за этот урок! Все понятно, особенно понравился последний штрих. Мне показалось это изящным)
    Но при этом же, возникло пару вопросов - а удобно ли это, когда у тебя все приватные переменные класса раскиданы по куче функций? Не возникает ли путаница, приватный метод задан в __init__ или нет? Ведь условное self.old = old выглядит как обычное, неприватное свойство, пока не изучишь код этого класса. Или это неважно? Типа так и рассчитано, чтобы чужой разработчик не лез куда не надо)) Вот у тебя свойство, им и пользуйся. Надеюсь, мои вопросы не сильно глупые.

  • @meganfox54
    @meganfox54 3 ปีที่แล้ว +1

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

  • @beardedman721
    @beardedman721 10 หลายเดือนก่อน +2

    Доброго времени суток. Во время просмотра видео у меня возник один вопрос, объясните пожалуйста, кто знает. Для чего мы делаем свойства приватными, а затем с помощью property даем доступ к этим свойствам пользователям? Почему нельзя просто взять и изначально сделать свойство old, общедоступным? То есть по факту мы с помощью property "отменили" приватность свойства old, так как теперь мы можем и записывать и извлекать значение.

  • @ИгорьЖуков-ч4б
    @ИгорьЖуков-ч4б 3 ปีที่แล้ว +2

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

  • @sedoy_dedushka
    @sedoy_dedushka 4 หลายเดือนก่อน +2

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

    • @SayXaNow
      @SayXaNow 4 หลายเดือนก่อน

      class Figure:
      def __init__(self) -> None:
      self.__inner_radius = 1
      self.__outer_radius = 1
      self.__base_radius = 99
      def radius_sum(self) -> int:
      return self.__base_radius + self.__inner_radius + self.__outer_radius

      def radius_property(name) -> property:
      def r_setter(self, value) -> None:
      if isinstance(value, int):
      if value < 0:
      raise ValueError(f"Радиус должен быть неотрицательным, но задано значение: {value}")
      else:
      if "_Figure" + name in self.__dict__:
      self.__dict__["_Figure" + name] = value
      else:
      raise ValueError(f"Не существует свойства с именем: {name}")
      else:
      raise TypeError(f"Радиус должен быть типа int, но задан: {type(value)}")
      def r_getter(self) -> int:
      if "_Figure" + name in self.__dict__:
      return self.__dict__["_Figure" + name]
      else:
      raise ValueError(f"Не существует свойства с именем: {name}")
      return property(r_getter, r_setter)
      # Делаем сколько угодно свойств с общими сеттерами и геттерами для обработки радиусов
      r1 = radius_property("__inner_radius")
      r2 = radius_property("__outer_radius")
      r3 = radius_property("__base_radius")
      # Основной код
      k = Figure()
      print(k.radius_sum())
      k.r1 = 9
      k.r2 = 11
      print(k.radius_sum())
      print(k.r3)

  • @ДимычДимон-г3ю
    @ДимычДимон-г3ю ปีที่แล้ว +2

    setter и property это как перегрузка оператора = в c++

  • @pokerpoker4865
    @pokerpoker4865 3 ปีที่แล้ว +2

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

  • @iliyanivanov6606
    @iliyanivanov6606 3 ปีที่แล้ว +1

    Супер

  • @non5309
    @non5309 2 ปีที่แล้ว +2

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

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +3

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

  • @jamjam3337
    @jamjam3337 ปีที่แล้ว +1

    Спасибо

  • @Arsenator-b3n
    @Arsenator-b3n 5 หลายเดือนก่อน +1

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

  • @МаксимЛеднев-ь5ф
    @МаксимЛеднев-ь5ф 2 ปีที่แล้ว +4

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

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +2

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

    • @SemyonKalyakulin
      @SemyonKalyakulin 2 ปีที่แล้ว +2

      в случае с методом verify-fio, надо делать classmethod, т.к. там используются константы класса, а в остальных методах - да, статики

  • @TSM_149
    @TSM_149 ปีที่แล้ว +1

    Спасибо за курс.
    Есть один вопрос. Почему бы не использовать для проверки паспортных данных regular expressions.

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

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

  • @zakirovio
    @zakirovio ปีที่แล้ว +1

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

  • @sladge17
    @sladge17 3 ปีที่แล้ว +1

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

  • @misha8280
    @misha8280 2 ปีที่แล้ว

    12:42 Почему в сеттере не нужно возвращать новое значение? (self.__old = old, почему без return self.__old)?

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว

      сеттер только устанавливает параметр, возвращать ничего не требуется

    • @misha8280
      @misha8280 2 ปีที่แล้ว +1

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

    • @misha8280
      @misha8280 2 ปีที่แล้ว

      @@selfedu_rus а еще вопрос. Курс на степике не планируете делать? А то вроде всё понятно, но хотелось бы закрепить. В интернете искал задачи, но пока что без успешно)

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว

      @@misha8280 просто времени нет, пока не до этого

  • @abrorizzatullaev836
    @abrorizzatullaev836 2 ปีที่แล้ว +1

    Great

  • @veraburak8049
    @veraburak8049 2 ปีที่แล้ว +1

    Святой чел

  • @8dimaximym8
    @8dimaximym8 ปีที่แล้ว +1

    Вы переодически используете метод type(). Читая книгу по Python, автор показывал этот метод, но всегда говорил, что лучше не использовать его, так как тем самым мы ограничиваем принципы динамической типизации. Как считаете, прав ли автор, не считается ли это плохим тоном программирования на Python?

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      Если брать isinstance(), то например, для типа bool будет проходить и тип int, так как bool наследуется от него. А вот type() отработает четко. Все зависит от задачи.

  • @luispakvard5681
    @luispakvard5681 2 ปีที่แล้ว +3

    Для паспорта и ФИО легче регулярку написать чем сложные методы городить с разбором строк

  • @rollsave8642
    @rollsave8642 9 หลายเดือนก่อน +1

    Здравствуйте, а случаем ли не избыточная проверка на len(s) < 1? Просто при split уже отсекаются строки с нулевым значением. Если нет, то приведите пример

    • @selfedu_rus
      @selfedu_rus  9 หลายเดือนก่อน +1

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

    • @SayXaNow
      @SayXaNow 9 หลายเดือนก่อน

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

    • @rollsave8642
      @rollsave8642 9 หลายเดือนก่อน

      @@SayXaNow а ну кстати да, почему-то сразу не подумал про то что сплитовать придется не только по пробелам, так программа более универсальная получается, спасибо!

  • @rasik-7462
    @rasik-7462 ปีที่แล้ว +1

    у меня вопрос, а можно ли в данном примере использовать для проверки декоратор staticmethod?
    не совсем понимаю почему тут используем classmethod

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว +2

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

    • @rasik-7462
      @rasik-7462 ปีที่แล้ว

      @@selfedu_rus спасибо!

  • @Davidianable
    @Davidianable 7 หลายเดือนก่อน +1

    Можно тупой вопрос? Почему в коде этого урока нет собственно декоратора property? Хотя в названии ролика он есть

    • @PythonSthenics
      @PythonSthenics 7 หลายเดือนก่อน

      Есть декоратор. Ты точно всё видео смотрел?

    • @Davidianable
      @Davidianable 7 หลายเดือนก่อน +1

      @@PythonSthenics Пересмотрел и действительно - есть. Извиняюсь, был не прав. Видимо это эффект от обучения - смотрю как баран на новые ворота, в упор многое не замечаю.

  • @konkotaro
    @konkotaro 3 ปีที่แล้ว +3

    В волшебных методов __setatr, __getatr, __getatribute тоже можна писать проверки и так же использывать как Вы в этом уроке. Я понимаю, что можна писать по-разному, но эти волшебные методы тогда более пригодятся в более сложных примерах или можна так и так как нравится писать? Хочу научится понимать тонкости. Спасибо

  • @forsakenwing5989
    @forsakenwing5989 2 ปีที่แล้ว +1

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

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว

      Если валидация привязана исключительно к данным класса Person, то городить огород из иерархий не вижу смысла. Если у вас планируется некий универсальный проверочный класс, то можно реализовать его как миксин.

  • @dubinin_s
    @dubinin_s 3 ปีที่แล้ว +1

    Спасибо за видео. Скажите, а свойства класса S_RUS и S_RUS_UPPER не лучше сделать приватными и обращаться к ним через соответствующий геттер? Заранее спасибо.

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว +2

      Да, только обращаться напрямую, т.к. мы же внутри класса с ними работаем.

    • @dubinin_s
      @dubinin_s 3 ปีที่แล้ว +1

      @@selfedu_rus ну да, логично. Спасибо за ответ.

  • @SweetyMeowwwwwww
    @SweetyMeowwwwwww 10 หลายเดือนก่อน +1

    я не могу понять, зачем вы проверяете наличие минимум 1 символа, хотя перед этим проверяли наличие 3 элементов, ведь если будет меньше 1 символа, то наверное будет меньше 3 элементов, разве нет?

    • @selfedu_rus
      @selfedu_rus  10 หลายเดือนก่อน

      != 3 - это 0, 1, 2, 4, ...

  • @hf0jgghhh427
    @hf0jgghhh427 6 หลายเดือนก่อน +1

    Не понимаю. Мы специально сделали поля с __ чтобы к ним нельзя было добраться извне, а теперь делаем так чтобы это было можно сделать?

    • @selfedu_rus
      @selfedu_rus  6 หลายเดือนก่อน

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

    • @hf0jgghhh427
      @hf0jgghhh427 6 หลายเดือนก่อน

      @@selfedu_rus это я понял. Но мы же их делали для инкапсуляции. То есть чтобы программист, который будет работать с нашим классом знал, что данное поле должно быть использовано внутри класса и работать с ним извне не надо(на сколько я понял) . Но теперь с помощью property мы делаем так чтобы могли обращаться к этим полям извне. Пока писал появилось предположение. Это для того чтобы мы могли читать и записывать их каким то особым образом через методы для добавления и чтения?

  • @emigrate89
    @emigrate89 8 หลายเดือนก่อน

    Я запутался, помогите! В предыдущем уроке сказано, что @property применяется для того, чтобы не плодить def get_ и def set_ для каждого атрибута. Но в этом видео мы так-же создаем геттер и сеттер для каждого атрибута, но еще и с доп строкой в виде @property или @.setter. Смысл?

    • @SayXaNow
      @SayXaNow 8 หลายเดือนก่อน +1

      Не совсем верно. Property - это особый тип (класс) данных. Переменные этого типа могут использоваться в выражениях так же, как и привычные типы данных (str, int) и т.д. Что более интуитивно и понятно.
      Если radius - наше свойство типа Property, то мы легко можем писать выражения вида:
      a.radius = 100 / (k + b + c)
      length = 8 * math.pi * a.radius
      Вместо:
      a.set_radius(100 / (k + b + c))
      length = 8 * math.pi * a.get_radius()
      ключевой особенностью этого типа данных является то, что он имеет свой собственный настраиваемый сеттер и геттер, который будет вызван при обращении к переменной этого типа. Что позволяет помимо банального извлечения или присвоения значения, прикрутить какую угодно дополнительную логику в сеттер и геттер. Например, сеттер автоматически может проверять корректность данных, и выдавать ошибку, если присваивается отрицательное значение.
      PS и да, в питоне на самом деле нет привычных типов данных как в других языках программирования. str, int и т.д. - это объекты (классы), через которые и происходит «симулирование» типов данных. Все в питоне - это объекты, функции - тоже объекты. Когда осознаешь это, станут понятны многие вещи, над которыми раньше не задумывался.
      s = "hello world" - создание класса str и присвоение ему значения "hello world"
      s.partition(" ") - вызов метода класса s
      (4 + 7).bit_length() - создание класса int, присвоение ему значения 11 и вызов метода класса bit_length(), для получения длины значения в битах.
      ---------------------
      Создание собственного класса, который будет обладать всеми свойствами строкового типа данных и дополнительным методом транслитерации:
      class my_string(str):
      def transliterate(self):
      d = {"р": "r", "в": "v"}
      return "".join([d[x] if x in d else x for x in self.__str__()])
      s = my_string("Привет, мир!")
      print(s.count("и")) - унаследовано от базового класса str
      print(s.transliterate()) - применение нашего собственного метода.

  • @alexanderdickson1679
    @alexanderdickson1679 หลายเดือนก่อน

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

  • @ИльмирШарифуллин-щ7т
    @ИльмирШарифуллин-щ7т 3 ปีที่แล้ว +1

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

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว +1

      Можно. Но обычные методы первым параметром принимают self, а здесь нам это не нужно. Поэтому и прописал @classmethod

  • @vadimnosurname
    @vadimnosurname 2 ปีที่แล้ว +1

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

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

      да лучше статик

  • @ibrahimoglu
    @ibrahimoglu 3 ปีที่แล้ว +1

    👍

  • @Receive_
    @Receive_ 2 ปีที่แล้ว +1

    Назрел вопрос. Если я буду пользоваться не @classmethod а обычным методом, но в параметре укажу cls - эту будет считаться плохим тоном или из этого в будущем можно получить ошибку. В данной программе все работает без ошибок.

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

      работать будет без ошибок, но да, это плохой тон ))

    • @Receive_
      @Receive_ 2 ปีที่แล้ว

      @@selfedu_rus Классно, что есть обратная связь. Попытался доработать форму, чтобы можно было вводить данные не в коде а в консоли. Прописал строку g = Person(input(), input(), input(), input()), но программа пропускает числовые инпуты. Пробовал обернуть числовые int() и float(), выдает ошибку ValueError: invalid literal for int() with base 10: '' Подскажите что не так?

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว

      @@Receive_ функция int(val) может преобразовать только строки с целыми числами

  • @orthodox-chanel
    @orthodox-chanel ปีที่แล้ว +3

    чтобы не прописывать все символы которые мы хотим проверить можно еще так прописать проверку через регулярные выражения
    import re
    if re.search(r'[^А-Яа-яЁё\s\-]', fio) != None:
    raise TypeError('Допустимы только Буквы, тире и пробел!')

    • @RealMineManUK
      @RealMineManUK ปีที่แล้ว +1

      Так же подумал и сделал, но вот вопрос, класс же теперь за собой тянет Re модуль, и нельзя им воспользоваться его нţимпортируя. Как вы думаете, имеет ли это значение?

    • @yaroslavchekomasov9918
      @yaroslavchekomasov9918 11 หลายเดือนก่อน +1

      Вместо "А-Яа-яЁё" работает "Ё-ё" - ещё короче.

    • @yaroslavchekomasov9918
      @yaroslavchekomasov9918 11 หลายเดือนก่อน

      @@RealMineManUK , ну модуль string Сергей импортирует без зазрений совести, так что не в том дело. re - тоже стандартная библииотека. Сергей писал, что regular expressions не использует, чтоб отдельно не объяснять, что это такое тем, кто не в курсе.

  • @Jevelin4kNone
    @Jevelin4kNone ปีที่แล้ว

    почему у меня в коде пишет ошибку с буквой s

  • @bigsmilefriend
    @bigsmilefriend 2 ปีที่แล้ว +1

    В чем смысл проверки длины слова на

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว

    • @bigsmilefriend
      @bigsmilefriend 2 ปีที่แล้ว +1

      @@selfedu_rus та не, я может неправильно написал. Напишите мне условие при котором мы вводим ФИО и выдает ошибку " в ФИО должен быть хотя бы один символ", пожалуйста, а то все равно не понимаю целесобразность этой проверки. Как по мне, она взаимоисключается при проверки на длину ФИО из 3 слов и что все символы буквы.
      СПАСИБО ВАМ, ЗА ВАШ ТРУД!
      Я хоть и не все понимаю, для меня не хватает домашних заданий....прям очень сильно!

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

      @@bigsmilefriend курс на Stepik делаю, недели 2-3 и будет

  • @iliyanivanov6606
    @iliyanivanov6606 3 ปีที่แล้ว +4

    Можно использовать в classmetod вот так(если Python 3.10):
    @classmethod
    def verify_weight(cls, weight: int | float):
    if not isinstance(weight, int | float) or weight < 20:
    raise TypeError(".......")
    извините за мой руский, если есть ошибки.

    • @donfedor007
      @donfedor007 3 ปีที่แล้ว

      текст про staticmethod, а код classmethod.....

  • @чимигечикарми-ч5т
    @чимигечикарми-ч5т ปีที่แล้ว +1

    Можно было проверять ФИО через регулярные выражения намного код проще стал бы

  • @vitaliykhomenko2669
    @vitaliykhomenko2669 3 หลายเดือนก่อน

    'абвгдеёжзийклмнопрстуфхцчшщъыьэюя-'
    Это должен быть первый коментарий)

  • @alexfin92
    @alexfin92 ปีที่แล้ว

    А зачем метод валидации возраста, веса и паспорта декорированы как classmethod, он же с данными класса не работают. И их поидее лучше staticmthod декорировать. И валидация ФИО тоже под вопросом. Данные класса же не изменяются, а только берутся для проверки символов, почему его простым методом не оставить. Мб я что-то не понимаю?

  • @sidorovich21101986
    @sidorovich21101986 3 ปีที่แล้ว +2

    А для нужен был декоратор @classmethod? Вы же говорили, что @classmethod используется в основном для статических методов.
    Ещё хотел сказать из опыта, что отчество всегда должно быть необязательным полем, так как у некоторых народов отчество является частью имени (поэтому отчество у них отсутствует), например, у монголов, тюрков и т. д.

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว +1

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

  • @АнтонВитальевич-т7к
    @АнтонВитальевич-т7к 2 ปีที่แล้ว

    Не совсем понятно применение в данном примере методов класса (за исключением verify_fio, т.к. в этом методе есть обращение к атрибутам класса)
    Почему именно методы класса, а не статические методы?

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

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

    • @АнтонВитальевич-т7к
      @АнтонВитальевич-т7к 2 ปีที่แล้ว

      @@selfedu_rus спасибо за ответ!
      Пытаюсь понять когда что используется.
      Считал, что если не работаем ни с атрибутами класса, ни с атрибутами экземпляра класса, то это и есть безальтернативный вариант статического метода.

  • @АлексейМедведев-г5ж
    @АлексейМедведев-г5ж ปีที่แล้ว +1

    А не проще проверять корректность символов так: set(s) < set(letters)?

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      да, это хороший подход, только здесь

  • @n0rmaLman
    @n0rmaLman 3 ปีที่แล้ว +4

    Немного позанудствую. Возраст по английски будет age, а old - это старый. Но, в любом случае спасибо за урок.

  • @tranklukatorz
    @tranklukatorz 2 ปีที่แล้ว

    Созрел вопрос после просмотра лекций - Как сделать такой же единый интерфейс(сеттер, геттер) но чтоб сеттер мог принимать не одно значение а несколько?
    Я пробовал с помощью проперти но как я понял там можно передавать только одно значение.. Ну или если я что-то упустил то поправьте меня :)

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +1

      через кортежи

  • @РустамРаджабов-ц3м
    @РустамРаджабов-ц3м 10 หลายเดือนก่อน +1

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

  • @victorstelmashchuk4840
    @victorstelmashchuk4840 3 ปีที่แล้ว +1

    Пока досконально не проверял, но на первый взгляд в проверке ФИО есть загвоздка с пробелами. По логике они должны быть раз используется split без аргументов, но в verify_fio они не разрешены.

    • @victorstelmashchuk4840
      @victorstelmashchuk4840 3 ปีที่แล้ว +1

      Хотя похоже проглядел, что в русских буквах в конце стоит пробел. Так что все ОК.

  • @vitaliikorenevich9315
    @vitaliikorenevich9315 2 ปีที่แล้ว +1

    Сергей Михайлович, а Вам точно 30?

  • @if_be
    @if_be ปีที่แล้ว

    Разве в программировании все начинается не с 0?

  • @freegigganigga
    @freegigganigga ปีที่แล้ว

    1:08 а если я Хасбик?)

  • @proskurlandsky
    @proskurlandsky 2 ปีที่แล้ว +1

    Только непонятно зачем верификаторы делать методами класса.

  • @ЯрославБеляев-т5к
    @ЯрославБеляев-т5к 3 ปีที่แล้ว +1

    Бедный Сергей Михайлович...
    70 лет проработал в одной организации...

  • @nikolaydemchenko6741
    @nikolaydemchenko6741 10 หลายเดือนก่อน +1

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

    • @Majohne
      @Majohne 10 หลายเดือนก่อน

      В данном случае это такой проект, который на след день не понадобится, поэтому так можно

    • @nikolaydemchenko6741
      @nikolaydemchenko6741 10 หลายเดือนก่อน

      @@Majohne можно показывать как делать не правильно, но не предупреждая, что это не правильно? По этой логике потом люди так же код и пишут, как увидели.

    • @Majohne
      @Majohne 10 หลายเดือนก่อน

      @@nikolaydemchenko6741 вряд-ли человек будет изучать ООП, если не изучил базу языка, в уроках которой обычно это все объясняют. Хотя мб есть и такие, кто при объяснении самого языка это используют и не говорят об этом

    • @nikolaydemchenko6741
      @nikolaydemchenko6741 10 หลายเดือนก่อน

      @@Majohne если ты пишешь код, и много, ты не будешь страдать такой ерундой типа тут и одной буквой сойдёт. У тебя в голове такое не возникнет в принципе, ты просто назовешь переменную максимально понятно и не будешь об этом вообще думать. И в этом курсе не совсем про ООП. Тут про реализацию классов и объектов в данном языке. Хотя многие думают, что это уже ООП.

  • @МамонтовОлег-в9о
    @МамонтовОлег-в9о 3 ปีที่แล้ว +1

    ёкарный бабай!

  • @LordRimus
    @LordRimus 2 ปีที่แล้ว

    Где-то в мире заплакала одна Жанна Кальман.

  • @dmitrytsmyh5971
    @dmitrytsmyh5971 ปีที่แล้ว +1

    Немного некрасиво использовать if type(fio) != str, в доках больше рекомендуется использовать isinstance.

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      Все зависит от задачи. Здесь да, можно isintance, но вот для проверки булевых величин isintance может возвращать неверный результат, т.к. выполняет определение типа с учетом наследования. Функция type более строгая.

  • @playt_pythonlearn
    @playt_pythonlearn 2 ปีที่แล้ว

    13:20

  • @cinbek9371
    @cinbek9371 3 ปีที่แล้ว

    Можно устроить проверку на символы и тире сделать вот так
    all([all(y.isalpha() for y in x.split()) for x in fio.split('-')])

  • @tbassir9076
    @tbassir9076 ปีที่แล้ว +1

    Всё чудесно и понятно, НО у меня почему то выскакивает ошибка на строке 12 self.verify_weight(weight) после запуска пишет line 12, in __init__ self.verify_weight(weight)
    AttributeError: 'Person' object has no attribute 'verify_weight'. Did you mean: 'verify_weght'?
    вот выложу весь код:
    from string import ascii_letters
    class Person:
    S_RUS = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя-'
    S_RUS_UPPER = S_RUS.upper()
    def __init__(self, fio, old, ps, weight):
    self.verify_fio(fio)
    self.verify_old(old)
    self.verify_ps(ps)
    self.verify_weight(weight)
    self.__fio = fio.split()
    self.__old = old
    self.__ps = ps
    self.__weight = weight
    @classmethod
    def verify_fio(cls, fio):
    if type(fio) != str:
    raise TypeError("ФИО должно быть строкой")
    f = fio.split()
    if len(f) != 3:
    raise ValueError("Неверный формат ФИО")
    letters = ascii_letters + cls.S_RUS + cls.S_RUS_UPPER
    for s in f:
    if len(s) < 1:
    raise TypeError("В ФИО должен быть хотя бы один символ")
    if len(s.strip(letters)) != 0:
    raise TypeError("В ФИО можно использовать только буквенные символы и дефис")
    @classmethod
    def verify_old(cls, old):
    if type(old) != int or old < 14 or old > 120:
    raise TypeError("Возраст должен быть целым числом в диапазоне [14, 120]")
    @classmethod
    def verify_weght(cls, w):
    if type(w) != float or w < 20:
    raise TypeError("Вес должен быть вещественным числом от 20 и выше")
    @classmethod
    def verify_ps(cls, ps):
    if type(ps) != str:
    raise TypeError("Паспорт должен быть строкой")
    s = ps.split()
    if len(s) != 2 or len(s[0]) != 4 or len(s[1]) != 6:
    raise TypeError("Неверный формат паспорта")
    for p in s:
    if not p.isdigit():
    raise TypeError("Серия и номер паспорта должны быть числами")
    @property
    def fio(self):
    return self.__fio
    @property
    def old(self):
    return self.__old
    @old.setter
    def old(self, old):
    self.verify_old(old)
    self.__old = old
    @property
    def weight(self):
    return self.__weight
    @weight.setter
    def weight(self, weight):
    self.__weight = weight
    @property
    def passport(self):
    return self.__passport
    @passport.setter
    def passport(self, ps):
    self.verify_ps(ps)
    self.__passport = ps
    p = Person('Балакирев Сергей Михайлович', 30, '1234 567890', 80.0)
    p.old = 100
    p.password = '4567 123456'
    p.weight = 70.0
    print(p.__dict__)

    • @Like_a_boosss
      @Like_a_boosss ปีที่แล้ว

      у тебя название функции verify_weght (пропустил "i")