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

  Рет қаралды 55,601

selfedu

selfedu

Күн бұрын

Пікірлер: 168
@ВадимСухотин-ю5д
@ВадимСухотин-ю5д 2 жыл бұрын
Маленькое уточнение к тексту в районе 6-7 минут: список f получен с помощью метода split, поэтому он не может содержать пустые строки. Даже если попадутся два подряд пробела, они будут восприняты как единый разделитель. Таким образом, проверка на нулевую длину строки s явно излишня.
@Хакохо
@Хакохо 8 ай бұрын
тоже это заметил, как ни вводи ФИО его придется либо ввести(чтобы не было ошибки), а если не ввести то возникнет ошибка из-за того что не указан аргумент, я правильно понял ?
@АртемНиконов-у7я
@АртемНиконов-у7я Жыл бұрын
Браво!!! Один из лучших курсов по ооп,лаконично,практично,без воды!
@jaksonmillka
@jaksonmillka 12 күн бұрын
Урок #10 = Наконец-то пройден Засел на этом уроке, около часа. 2 раза пересматривал, чтобы точно все понять, и параллельно практиковался. Для себя понял, что все это время, очень сильно усложнял проверки, и в целом код, в своих псевдо проектах. Уже как-то начинается меняться логика с обычного знатока, который просто знает синтаксис, на реально похожего на разработчика. Спасибо Вам. Хоть и понимаю, что это даже не верхушка айсберга, но все же, начало положено :)
@anb76ru13
@anb76ru13 2 жыл бұрын
класные уроки! их бы еще в курс оформить на степике с практическими заданиями. и будет вообще бомба
@dmitriivanov7010
@dmitriivanov7010 2 жыл бұрын
Теперь есть, го на степик
@anb76ru13
@anb76ru13 2 жыл бұрын
@@dmitriivanov7010 уже)
@aleksandrsemenov1764
@aleksandrsemenov1764 2 жыл бұрын
Самое сложно было понять, почему в конце убрали __ перед свойствами. self.item внутри __init__ - это имя нашего объекта property. То есть мы просто вынесли присваивание self.item = __item в сеттер.
@ymnop9652
@ymnop9652 2 жыл бұрын
Я правильно понял что скажем с примером old. self.old = old эта команда вызывает сеттер @old.setter в котом и проходит проверка? И это всё происходит потому что у сеттера приоритет выше?
@ivanivanovich975
@ivanivanovich975 Жыл бұрын
@@ymnop9652 я тоже полез в комменты за поиском ответа. Скорее всего вы правы, дело в высшем приоритете сеттера, а значит переопределить значение обратившись напрямую к свойству не получится, только через сеттер
@sedoy_dedushka
@sedoy_dedushka Ай бұрын
Когда мы создавали сеттеры и геттеры (идентичные по наполнению и различные только именем переменной), возникла мысль, что можно создать некую функцию, которая будет автоматически создавать в моменте сеттер и геттер по использованному при вызове аргументу (чтобы не дублировать для каждого аргумента сеттер и геттер) такое действительно можно реализовать?
@SayXaNow
@SayXaNow 28 күн бұрын
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ю 9 ай бұрын
setter и property это как перегрузка оператора = в c++
@debirtv8267
@debirtv8267 Ай бұрын
а почему нельзя использовать обычные функции без декоратора классметод? Мы же просто меняем ссылку на экземпляр на ссылку класса
@beardedman721
@beardedman721 7 ай бұрын
Доброго времени суток. Во время просмотра видео у меня возник один вопрос, объясните пожалуйста, кто знает. Для чего мы делаем свойства приватными, а затем с помощью property даем доступ к этим свойствам пользователям? Почему нельзя просто взять и изначально сделать свойство old, общедоступным? То есть по факту мы с помощью property "отменили" приватность свойства old, так как теперь мы можем и записывать и извлекать значение.
@чимигечикарми-ч5т
@чимигечикарми-ч5т 8 ай бұрын
Можно было проверять ФИО через регулярные выражения намного код проще стал бы
@sofiipochta
@sofiipochta Ай бұрын
Спасибо, посмотрела!
@Лена-в1н6ы
@Лена-в1н6ы 10 ай бұрын
Спасибо огромное! Вы - талантливый учитель. Все по полочкам с акцентами на причины действий. Так материал воспринимается и усваивается, как вполне простой. Другие учителя больше "колдуют", пытаясь вызвать удивление. Удивляться не хочу, хочу учиться!
@erikdeveloper
@erikdeveloper Жыл бұрын
Храни Вас Господь 🙏
@AS-th7xe
@AS-th7xe Жыл бұрын
Здравствуйте, вопрос: а где идёт проверка возраста, веса, паспорта мы же не используем атрибуты класса, не лучше ли использовать staticmethod?
@sega6574
@sega6574 2 жыл бұрын
нереально крутой пример, понятно все абсолютно хорошо, преподаватель от Бога!
@non5309
@non5309 2 жыл бұрын
в самом конце немного не понятно, почему когда удаляли __ у аргументов, это сразу значило что будет выполнятся проверка аргументов на условия в сеттерах?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
два подчеркивания - это локальное свойство, а без них - объект property, что мы определили
@aston585
@aston585 Жыл бұрын
Сергей Михайлович, огромное тебе человеческое 'спасибо'.upper() за понятное донесение знаний!
@sedoy_dedushka
@sedoy_dedushka Ай бұрын
'спасибо'.upper() - это очень мощно xD
@kirkarimov1418
@kirkarimov1418 Жыл бұрын
Сергей, всё очень здорово. Писал раньше только линейно в ООП перехожу вместе с вами. несколько незначительных ремарок(для новичков в программировании они могут быть полезны): 1. Возраст на английском "age" (old - это прилагательное "старый"... мне на протяжении ролика очень сильно резало слух) 2. C точки зрения хранения таких данных, корректнее хранить дату рождения, а возраст рассчитывать от ДР 3. Если будет введен вес целым числом - это же не ошибка... ;)
@Работа-н9в
@Работа-н9в 3 ай бұрын
Стоп, а почему "How old are you?', когда спрашивают про возраст?
@estelliarONE
@estelliarONE 2 ай бұрын
@@Работа-н9в По сути вариант с "How old are you?" - Подразумевает "Насколько ты стар(а)" - Просто прижилась такая формулировка. Но ещё используют и вариант по типу: "What's your age?" но гораздо реже первого
@sedoy_dedushka
@sedoy_dedushka Ай бұрын
по поводу 3 пункта тоже так подумал и использовал при проверке if not isinstance(weight, (int, float))
@dmitrytsmyh5971
@dmitrytsmyh5971 Жыл бұрын
Немного некрасиво использовать if type(fio) != str, в доках больше рекомендуется использовать isinstance.
@selfedu_rus
@selfedu_rus Жыл бұрын
Все зависит от задачи. Здесь да, можно isintance, но вот для проверки булевых величин isintance может возвращать неверный результат, т.к. выполняет определение типа с учетом наследования. Функция type более строгая.
@vitaliykhomenko2669
@vitaliykhomenko2669 24 күн бұрын
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя-' Это должен быть первый коментарий)
@SweetyMeowwwwwww
@SweetyMeowwwwwww 7 ай бұрын
я не могу понять, зачем вы проверяете наличие минимум 1 символа, хотя перед этим проверяли наличие 3 элементов, ведь если будет меньше 1 символа, то наверное будет меньше 3 элементов, разве нет?
@selfedu_rus
@selfedu_rus 7 ай бұрын
!= 3 - это 0, 1, 2, 4, ...
@luispakvard5681
@luispakvard5681 2 жыл бұрын
Для паспорта и ФИО легче регулярку написать чем сложные методы городить с разбором строк
@playt_pythonlearn
@playt_pythonlearn 2 жыл бұрын
все в учебных целях
@ИгорьЖуков-ч4б
@ИгорьЖуков-ч4б 2 жыл бұрын
Сергей, спасибо большой за практический пример! Единственно, мне кажется, что все эти валидации можно было бы в несколько раз короче написать через регулярные выражения)) Или тут смысл в том, чтобы более гибко классифицировать ошибки?
@Davidianable
@Davidianable 4 ай бұрын
Можно тупой вопрос? Почему в коде этого урока нет собственно декоратора property? Хотя в названии ролика он есть
@PythonSthenics
@PythonSthenics 3 ай бұрын
Есть декоратор. Ты точно всё видео смотрел?
@Davidianable
@Davidianable 3 ай бұрын
@@PythonSthenics Пересмотрел и действительно - есть. Извиняюсь, был не прав. Видимо это эффект от обучения - смотрю как баран на новые ворота, в упор многое не замечаю.
@hf0jgghhh427
@hf0jgghhh427 3 ай бұрын
Не понимаю. Мы специально сделали поля с __ чтобы к ним нельзя было добраться извне, а теперь делаем так чтобы это было можно сделать?
@selfedu_rus
@selfedu_rus 3 ай бұрын
к полям __ нельзя обращаться извне (это не защита от злоумышленника, а предупреждение для программиста), внутри методов класса можно
@hf0jgghhh427
@hf0jgghhh427 3 ай бұрын
@@selfedu_rus это я понял. Но мы же их делали для инкапсуляции. То есть чтобы программист, который будет работать с нашим классом знал, что данное поле должно быть использовано внутри класса и работать с ним извне не надо(на сколько я понял) . Но теперь с помощью property мы делаем так чтобы могли обращаться к этим полям извне. Пока писал появилось предположение. Это для того чтобы мы могли читать и записывать их каким то особым образом через методы для добавления и чтения?
@donfedor007
@donfedor007 2 жыл бұрын
Спасибо за урок! Как всегда по красоте!
@tanyadiduk3640
@tanyadiduk3640 Жыл бұрын
Вы очень понятно и доступно объясняете! Я уже просмотрела ролики по ООП у другого автора на ютуб, при чем не бесплатно, и не всегда было понятно для чего оно и как использовать. Ваши видео не просто освежают знания, но и расставляют по полочкам то что недопоняла раньше. СПАСИБО ЗА ВАШ ТРУД!
@Watcherfromfar
@Watcherfromfar 7 ай бұрын
Спасибо большое за этот урок! Все понятно, особенно понравился последний штрих. Мне показалось это изящным) Но при этом же, возникло пару вопросов - а удобно ли это, когда у тебя все приватные переменные класса раскиданы по куче функций? Не возникает ли путаница, приватный метод задан в __init__ или нет? Ведь условное self.old = old выглядит как обычное, неприватное свойство, пока не изучишь код этого класса. Или это неважно? Типа так и рассчитано, чтобы чужой разработчик не лез куда не надо)) Вот у тебя свойство, им и пользуйся. Надеюсь, мои вопросы не сильно глупые.
@ДенисКрбнкв
@ДенисКрбнкв Жыл бұрын
Отличный пример! Спасибо! Понял не только проперти, а ещё классмедоды и вообще начал осознавать смысл ооп :D
@vladimirkulakov6126
@vladimirkulakov6126 2 жыл бұрын
Спасибо за крутой практический урок! Натренировал, пальцы теперь помнят)
@iliyanivanov6606
@iliyanivanov6606 2 жыл бұрын
Можно использовать в 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 2 жыл бұрын
текст про staticmethod, а код classmethod.....
@zakirovio
@zakirovio Жыл бұрын
Добрый день. Не могу разобраться как кратко и четко описать property. Правильно ли будет сказать, что главной опцией объектов property является создание общего имени для сеттера, геттера или делитера, которое хранит ссылки на них и через это имя, в зависимости от используемого оператора (присвоения, удаления, отсутствия оператора) можно вызвать нужный метод?
@СергейКириллов-ь9ю
@СергейКириллов-ь9ю 2 жыл бұрын
Очередное классное видео. Очень все внятно-понятно.
@Dmitrii-Zhinzhilov
@Dmitrii-Zhinzhilov Жыл бұрын
Отличный урок! Благодарю!! 🔥
@МаксимЛеднев-ь5ф
@МаксимЛеднев-ь5ф 2 жыл бұрын
Отличный плейлист! Спасибо большое за уроки. Я не очень понимаю, почему всё эти проверочные методы это классовые методы. В моём понимании их функционал не задействует ни классовые атрибуты, ни атрибуты экземпляров класса, то есть имеет смысл сделать их статическими. Так ли это или я чего-то не понимаю?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Спасибо! Здесь учебный пример для демонстрации, чтобы вы знали возможности языка. Всегда делайте обычные методы, а если возникнет необходимость, то уже задумайтесь над другими типами.
@SemyonKalyakulin
@SemyonKalyakulin 2 жыл бұрын
в случае с методом verify-fio, надо делать classmethod, т.к. там используются константы класса, а в остальных методах - да, статики
@rollsave8642
@rollsave8642 6 ай бұрын
Здравствуйте, а случаем ли не избыточная проверка на len(s) < 1? Просто при split уже отсекаются строки с нулевым значением. Если нет, то приведите пример
@selfedu_rus
@selfedu_rus 6 ай бұрын
лучше сделать для надежности последующего редактирования программы; если на все полагаться, то малейшие изменения в коде приведут к большим непредвиденным ошибкам
@SayXaNow
@SayXaNow 6 ай бұрын
Такое имеет место быть конкретно в этом примере, в случае сплита по вайтспейсу без параметра. На практике, очень часто, например, при парсинге CSV или табулированных таблиц, разделители уже конкретные, и пустые строки возникают сплошь и рядом. Поэтому, в случае обработки табличного вида данных, проверки на пустые строки не то что не лишние, а просто необходимы, в силу того, что обычный сплит без параметра там как правило не применяется. Ну, а если случай тривиальный, и точно уверен, что разделителем всегда будет пробельная последовательность - то да, тут пустых строк не может быть.
@rollsave8642
@rollsave8642 6 ай бұрын
@@SayXaNow а ну кстати да, почему-то сразу не подумал про то что сплитовать придется не только по пробелам, так программа более универсальная получается, спасибо!
@РустамРаджабов-ц3м
@РустамРаджабов-ц3м 7 ай бұрын
а зачем тут проперти, могли бы оставить просто так, просто чтобы вызов сеттера и геттера был публично обозначен и все что ли ??
@alexlutor72
@alexlutor72 2 жыл бұрын
wow, Сергей, прям по полочкам всё закидал. благодарю, за лучшие уроки python в рунете
@sladge17
@sladge17 2 жыл бұрын
letters сразу можно было сделать атрибутом класса, тогда он не будет заново пересчитываться при создании нового экземпляра.
@tbassir9076
@tbassir9076 Жыл бұрын
Всё чудесно и понятно, НО у меня почему то выскакивает ошибка на строке 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")
@ЯрославБеляев-т5к
@ЯрославБеляев-т5к 2 жыл бұрын
Бедный Сергей Михайлович... 70 лет проработал в одной организации...
@pokerpoker4865
@pokerpoker4865 2 жыл бұрын
Спасибо за отличный плейлист! Сколько всего видео планируете снять?
@proskurlandsky
@proskurlandsky 2 жыл бұрын
Только непонятно зачем верификаторы делать методами класса.
@a_n_gel-j6m
@a_n_gel-j6m 2 жыл бұрын
Супер!! Спасибо! Теперь все по полочкам разложилось))))
@vlakin1
@vlakin1 2 жыл бұрын
Как здорово что я Вас нашел :-)
@alexanderg9089
@alexanderg9089 2 жыл бұрын
Отлично показаны best practices , да еще на пальцах. Спасибо! Сергей, понимаю, что это примеры обучающие примитивные. Но можно предлагать альтернативные варианты проверок для самостоятельного обучения. Например проверку допустимых символов через множества. Форма серии номера паспорта через регулярные выражения. Реализовывать не надо, просто пометку ....тут можно по другому, это задание на 5+, кто чувствует силы попытайтесь сами, нет - пропустите.
@oleksandrkorinko6145
@oleksandrkorinko6145 2 жыл бұрын
Спасибо автору, очень подробное изложение материала
@orthodox-chanel
@orthodox-chanel Жыл бұрын
чтобы не прописывать все символы которые мы хотим проверить можно еще так прописать проверку через регулярные выражения import re if re.search(r'[^А-Яа-яЁё\s\-]', fio) != None: raise TypeError('Допустимы только Буквы, тире и пробел!')
@RealMineManUK
@RealMineManUK Жыл бұрын
Так же подумал и сделал, но вот вопрос, класс же теперь за собой тянет Re модуль, и нельзя им воспользоваться его нţимпортируя. Как вы думаете, имеет ли это значение?
@yaroslavchekomasov9918
@yaroslavchekomasov9918 8 ай бұрын
Вместо "А-Яа-яЁё" работает "Ё-ё" - ещё короче.
@yaroslavchekomasov9918
@yaroslavchekomasov9918 8 ай бұрын
@@RealMineManUK , ну модуль string Сергей импортирует без зазрений совести, так что не в том дело. re - тоже стандартная библииотека. Сергей писал, что regular expressions не использует, чтоб отдельно не объяснять, что это такое тем, кто не в курсе.
@nailnail1000
@nailnail1000 2 жыл бұрын
Спасибо, Сергей, за крутой урок!
@andredru4278
@andredru4278 7 ай бұрын
Спасибо. Уже привык к понятным объяснениям.
@abrorizzatullaev836
@abrorizzatullaev836 Жыл бұрын
Great
@vitaliikorenevich9315
@vitaliikorenevich9315 2 жыл бұрын
Сергей Михайлович, а Вам точно 30?
@nikolaydemchenko6741
@nikolaydemchenko6741 7 ай бұрын
Это такая своя традиция когда пишешь на питоне, называть переменные одной буквой, чтоб через пять минут не помнить, что это? Не у первого автора это вижу, глаза режет и душу рвёт.
@Majohne
@Majohne 7 ай бұрын
В данном случае это такой проект, который на след день не понадобится, поэтому так можно
@nikolaydemchenko6741
@nikolaydemchenko6741 7 ай бұрын
@@Majohne можно показывать как делать не правильно, но не предупреждая, что это не правильно? По этой логике потом люди так же код и пишут, как увидели.
@Majohne
@Majohne 7 ай бұрын
@@nikolaydemchenko6741 вряд-ли человек будет изучать ООП, если не изучил базу языка, в уроках которой обычно это все объясняют. Хотя мб есть и такие, кто при объяснении самого языка это используют и не говорят об этом
@nikolaydemchenko6741
@nikolaydemchenko6741 7 ай бұрын
@@Majohne если ты пишешь код, и много, ты не будешь страдать такой ерундой типа тут и одной буквой сойдёт. У тебя в голове такое не возникнет в принципе, ты просто назовешь переменную максимально понятно и не будешь об этом вообще думать. И в этом курсе не совсем про ООП. Тут про реализацию классов и объектов в данном языке. Хотя многие думают, что это уже ООП.
@TSM_149
@TSM_149 Жыл бұрын
Спасибо за курс. Есть один вопрос. Почему бы не использовать для проверки паспортных данных regular expressions.
@selfedu_rus
@selfedu_rus Жыл бұрын
да, вполне можно, просто это отдельный модуль и далеко не все им умеют пользоваться
@8dimaximym8
@8dimaximym8 Жыл бұрын
Вы переодически используете метод type(). Читая книгу по Python, автор показывал этот метод, но всегда говорил, что лучше не использовать его, так как тем самым мы ограничиваем принципы динамической типизации. Как считаете, прав ли автор, не считается ли это плохим тоном программирования на Python?
@selfedu_rus
@selfedu_rus Жыл бұрын
Если брать isinstance(), то например, для типа bool будет проходить и тип int, так как bool наследуется от него. А вот type() отработает четко. Все зависит от задачи.
@he4esystem494
@he4esystem494 10 ай бұрын
Отличный урок. Спасибо!
@sergeigaribzyanov6061
@sergeigaribzyanov6061 2 жыл бұрын
Я в восторге!!! Огромное спасибо тебе!
@emigrate89
@emigrate89 5 ай бұрын
Я запутался, помогите! В предыдущем уроке сказано, что @property применяется для того, чтобы не плодить def get_ и def set_ для каждого атрибута. Но в этом видео мы так-же создаем геттер и сеттер для каждого атрибута, но еще и с доп строкой в виде @property или @.setter. Смысл?
@SayXaNow
@SayXaNow 5 ай бұрын
Не совсем верно. 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()) - применение нашего собственного метода.
@python_95
@python_95 2 жыл бұрын
давно ждал таких уроков. Спасибо большое
@mjolnik
@mjolnik 8 ай бұрын
Как будто бы начинаю что-то понимать. Спасибо)
@АлексейМедведев-г5ж
@АлексейМедведев-г5ж Жыл бұрын
А не проще проверять корректность символов так: set(s) < set(letters)?
@selfedu_rus
@selfedu_rus Жыл бұрын
да, это хороший подход, только здесь
@Jevelin4kNone
@Jevelin4kNone 11 ай бұрын
почему у меня в коде пишет ошибку с буквой s
@bigsmilefriend
@bigsmilefriend 2 жыл бұрын
В чем смысл проверки длины слова на
@selfedu_rus
@selfedu_rus 2 жыл бұрын
@bigsmilefriend
@bigsmilefriend 2 жыл бұрын
@@selfedu_rus та не, я может неправильно написал. Напишите мне условие при котором мы вводим ФИО и выдает ошибку " в ФИО должен быть хотя бы один символ", пожалуйста, а то все равно не понимаю целесобразность этой проверки. Как по мне, она взаимоисключается при проверки на длину ФИО из 3 слов и что все символы буквы. СПАСИБО ВАМ, ЗА ВАШ ТРУД! Я хоть и не все понимаю, для меня не хватает домашних заданий....прям очень сильно!
@selfedu_rus
@selfedu_rus 2 жыл бұрын
@@bigsmilefriend курс на Stepik делаю, недели 2-3 и будет
@alexfin92
@alexfin92 10 ай бұрын
А зачем метод валидации возраста, веса и паспорта декорированы как classmethod, он же с данными класса не работают. И их поидее лучше staticmthod декорировать. И валидация ФИО тоже под вопросом. Данные класса же не изменяются, а только берутся для проверки символов, почему его простым методом не оставить. Мб я что-то не понимаю?
@selfedu_rus
@selfedu_rus 10 ай бұрын
согласен!
@ИльмирШарифуллин-щ7т
@ИльмирШарифуллин-щ7т 2 жыл бұрын
я немного не понял, для чего здесь строчка @classmethod? Почему нельзя было делать без нее с помощью обычных функций?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Можно. Но обычные методы первым параметром принимают self, а здесь нам это не нужно. Поэтому и прописал @classmethod
@gta_KaskaD
@gta_KaskaD 2 жыл бұрын
Супер, спасибо большое.
@ISAWER1
@ISAWER1 Жыл бұрын
лайк и комментарий в поддержку канала
@tranklukatorz
@tranklukatorz 2 жыл бұрын
Мое почтение за ваши труды!!
@forsakenwing5989
@forsakenwing5989 2 жыл бұрын
Здравствуйте! Хотел уточнить, в плане структуры не лучше было создать дочерний класс с валидацией этих данных и поместить его в другой файл?(А в основной - этот, импортировать)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Если валидация привязана исключительно к данным класса Person, то городить огород из иерархий не вижу смысла. Если у вас планируется некий универсальный проверочный класс, то можно реализовать его как миксин.
@cinbek9371
@cinbek9371 2 жыл бұрын
Мне очень нравятся твои видео, на обеде постоянно смотрю
@mrrototo761
@mrrototo761 7 ай бұрын
Я тоже смотрела на обеде ❤
@web4453
@web4453 2 жыл бұрын
спасибо! живите 100 лет
@vadimnosurname
@vadimnosurname Жыл бұрын
почему не статикметод используется для проверки возраста и веса?
@selfedu_rus
@selfedu_rus Жыл бұрын
да лучше статик
@dubinin_s
@dubinin_s 2 жыл бұрын
Спасибо за видео. Скажите, а свойства класса S_RUS и S_RUS_UPPER не лучше сделать приватными и обращаться к ним через соответствующий геттер? Заранее спасибо.
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Да, только обращаться напрямую, т.к. мы же внутри класса с ними работаем.
@dubinin_s
@dubinin_s 2 жыл бұрын
@@selfedu_rus ну да, логично. Спасибо за ответ.
@n0rmaLman
@n0rmaLman 2 жыл бұрын
Немного позанудствую. Возраст по английски будет age, а old - это старый. Но, в любом случае спасибо за урок.
@rasik-7462
@rasik-7462 Жыл бұрын
у меня вопрос, а можно ли в данном примере использовать для проверки декоратор staticmethod? не совсем понимаю почему тут используем classmethod
@selfedu_rus
@selfedu_rus Жыл бұрын
да, верно, если нет обращений к атрибуту класса, то staticmethod достаточно и предпочтительно
@rasik-7462
@rasik-7462 Жыл бұрын
@@selfedu_rus спасибо!
@suslikest3708
@suslikest3708 Жыл бұрын
Отдельное спасибо за такой практический урок т к это помогает закрепить материал.
@asilbekmirolimov7430
@asilbekmirolimov7430 2 жыл бұрын
какая разница между @classmethod и без @classmethod
@suslikest3708
@suslikest3708 Жыл бұрын
Отдельное спасибо за такой практический урок т к это помогает закрепить материал.
@freegigganigga
@freegigganigga Жыл бұрын
1:08 а если я Хасбик?)
@freeforrussia
@freeforrussia 2 жыл бұрын
Спасибо, давайте ещё про классы!
@veraburak8049
@veraburak8049 Жыл бұрын
Святой чел
@ymnop9652
@ymnop9652 2 жыл бұрын
А можно для тех кто в танке, на котиках и яблочках объяснить что происходит на последних минутах видео? @selfedu
@Ruslan501
@Ruslan501 5 ай бұрын
Маэстро, отличное объяснение. Отличный пример!
@Developer_python_
@Developer_python_ Жыл бұрын
За последний штрих особый лайк-думал скажете или нет))))
@jamjam3337
@jamjam3337 Жыл бұрын
Спасибо
@андрейхоменко-и5я
@андрейхоменко-и5я 2 жыл бұрын
Браво... Прекрасный материал...
@Receive_
@Receive_ 2 жыл бұрын
Назрел вопрос. Если я буду пользоваться не @classmethod а обычным методом, но в параметре укажу cls - эту будет считаться плохим тоном или из этого в будущем можно получить ошибку. В данной программе все работает без ошибок.
@selfedu_rus
@selfedu_rus 2 жыл бұрын
работать будет без ошибок, но да, это плохой тон ))
@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) может преобразовать только строки с целыми числами
@МамонтовОлег-в9о
@МамонтовОлег-в9о 2 жыл бұрын
ёкарный бабай!
@nik01aich
@nik01aich Жыл бұрын
четко и по делу!
@if_be
@if_be Жыл бұрын
Разве в программировании все начинается не с 0?
@Like_a_boosss
@Like_a_boosss Жыл бұрын
Это ты к чему?
@meganfox54
@meganfox54 2 жыл бұрын
Спасибо за урок
@iliyanivanov6606
@iliyanivanov6606 2 жыл бұрын
Супер
@ibrahimoglu
@ibrahimoglu 2 жыл бұрын
👍
@ОлегТруе
@ОлегТруе 2 жыл бұрын
Ваши классы просто класс 👍
@LordRimus
@LordRimus 2 жыл бұрын
Где-то в мире заплакала одна Жанна Кальман.
@tranklukatorz
@tranklukatorz 2 жыл бұрын
Созрел вопрос после просмотра лекций - Как сделать такой же единый интерфейс(сеттер, геттер) но чтоб сеттер мог принимать не одно значение а несколько? Я пробовал с помощью проперти но как я понял там можно передавать только одно значение.. Ну или если я что-то упустил то поправьте меня :)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
через кортежи
@konkotaro
@konkotaro 2 жыл бұрын
В волшебных методов __setatr, __getatr, __getatribute тоже можна писать проверки и так же использывать как Вы в этом уроке. Я понимаю, что можна писать по-разному, но эти волшебные методы тогда более пригодятся в более сложных примерах или можна так и так как нравится писать? Хочу научится понимать тонкости. Спасибо
@ДімаКуріптя
@ДімаКуріптя 11 ай бұрын
тоже интересно
@АнтонВитальевич-т7к
@АнтонВитальевич-т7к 2 жыл бұрын
Не совсем понятно применение в данном примере методов класса (за исключением verify_fio, т.к. в этом методе есть обращение к атрибутам класса) Почему именно методы класса, а не статические методы?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
строгих правил тут нет, но если мы в методе не собираемся работать с атрибутами объектов, то это кандидат на класс-метод. Статические вообще очень редко задаются и, как правило, это какие то сторонние вспомогательные функции, связанные как то с тематикой класса и не более того. С опытом придет понимание.
@АнтонВитальевич-т7к
@АнтонВитальевич-т7к 2 жыл бұрын
@@selfedu_rus спасибо за ответ! Пытаюсь понять когда что используется. Считал, что если не работаем ни с атрибутами класса, ни с атрибутами экземпляра класса, то это и есть безальтернативный вариант статического метода.
@playt_pythonlearn
@playt_pythonlearn 2 жыл бұрын
13:20
@misha8280
@misha8280 2 жыл бұрын
12:42 Почему в сеттере не нужно возвращать новое значение? (self.__old = old, почему без return self.__old)?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
сеттер только устанавливает параметр, возвращать ничего не требуется
@misha8280
@misha8280 2 жыл бұрын
@@selfedu_rus понял, спасибо)
@misha8280
@misha8280 2 жыл бұрын
@@selfedu_rus а еще вопрос. Курс на степике не планируете делать? А то вроде всё понятно, но хотелось бы закрепить. В интернете искал задачи, но пока что без успешно)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
@@misha8280 просто времени нет, пока не до этого
Крутой фокус + секрет! #shorts
00:10
Роман Magic
Рет қаралды 22 МЛН
规则,在门里生存,出来~死亡
00:33
落魄的王子
Рет қаралды 25 МЛН
Поветкин заставил себя уважать!
01:00
МИНУС БАЛЛ
Рет қаралды 7 МЛН
Доступ к свойствам объекта. Property и slots
42:54
__new__ или __init__ в Python? Знаете ли вы это..
12:37
ТВОЯ ГЛАВНАЯ ОШИБКА В ООП
8:45
ExtremeCode
Рет қаралды 613 М.
Как работать с классами в Python и для чего они нужны
22:04
Senior Tester | Евгений Окулик
Рет қаралды 10 М.
Крутой фокус + секрет! #shorts
00:10
Роман Magic
Рет қаралды 22 МЛН