Браво!!! Один из лучших курсов по ооп,лаконично,практично,без воды!
@jaksonmillka4 ай бұрын
Урок #10 = Наконец-то пройден Засел на этом уроке, около часа. 2 раза пересматривал, чтобы точно все понять, и параллельно практиковался. Для себя понял, что все это время, очень сильно усложнял проверки, и в целом код, в своих псевдо проектах. Уже как-то начинается меняться логика с обычного знатока, который просто знает синтаксис, на реально похожего на разработчика. Спасибо Вам. Хоть и понимаю, что это даже не верхушка айсберга, но все же, начало положено :)
@Лена-в1н6ы Жыл бұрын
Спасибо огромное! Вы - талантливый учитель. Все по полочкам с акцентами на причины действий. Так материал воспринимается и усваивается, как вполне простой. Другие учителя больше "колдуют", пытаясь вызвать удивление. Удивляться не хочу, хочу учиться!
@aston585 Жыл бұрын
Сергей Михайлович, огромное тебе человеческое 'спасибо'.upper() за понятное донесение знаний!
@sedoy_dedushka5 ай бұрын
'спасибо'.upper() - это очень мощно xD
@tanyadiduk3640 Жыл бұрын
Вы очень понятно и доступно объясняете! Я уже просмотрела ролики по ООП у другого автора на ютуб, при чем не бесплатно, и не всегда было понятно для чего оно и как использовать. Ваши видео не просто освежают знания, но и расставляют по полочкам то что недопоняла раньше. СПАСИБО ЗА ВАШ ТРУД!
@sega65742 жыл бұрын
нереально крутой пример, понятно все абсолютно хорошо, преподаватель от Бога!
@anb76ru133 жыл бұрын
класные уроки! их бы еще в курс оформить на степике с практическими заданиями. и будет вообще бомба
@dmitriivanov70102 жыл бұрын
Теперь есть, го на степик
@anb76ru132 жыл бұрын
@@dmitriivanov7010 уже)
@alexlutor722 жыл бұрын
wow, Сергей, прям по полочкам всё закидал. благодарю, за лучшие уроки python в рунете
@ДенисКрбнкв Жыл бұрын
Отличный пример! Спасибо! Понял не только проперти, а ещё классмедоды и вообще начал осознавать смысл ооп :D
@erikdeveloper2 жыл бұрын
Храни Вас Господь 🙏
@fedorevg70913 ай бұрын
Аминь.
@suslikest3708 Жыл бұрын
Отдельное спасибо за такой практический урок т к это помогает закрепить материал.
@cinbek93713 жыл бұрын
Мне очень нравятся твои видео, на обеде постоянно смотрю
@mrrototo76111 ай бұрын
Я тоже смотрела на обеде ❤
@ВадимСухотин-ю5д2 жыл бұрын
Маленькое уточнение к тексту в районе 6-7 минут: список f получен с помощью метода split, поэтому он не может содержать пустые строки. Даже если попадутся два подряд пробела, они будут восприняты как единый разделитель. Таким образом, проверка на нулевую длину строки s явно излишня.
@Хакохо11 ай бұрын
тоже это заметил, как ни вводи ФИО его придется либо ввести(чтобы не было ошибки), а если не ввести то возникнет ошибка из-за того что не указан аргумент, я правильно понял ?
@mjolnik Жыл бұрын
Как будто бы начинаю что-то понимать. Спасибо)
@СергейКириллов-ь9ю3 жыл бұрын
Очередное классное видео. Очень все внятно-понятно.
@vladimirkulakov61263 жыл бұрын
Спасибо за крутой практический урок! Натренировал, пальцы теперь помнят)
@vlakin13 жыл бұрын
Как здорово что я Вас нашел :-)
@donfedor0073 жыл бұрын
Спасибо за урок! Как всегда по красоте!
@kirkarimov1418 Жыл бұрын
Сергей, всё очень здорово. Писал раньше только линейно в ООП перехожу вместе с вами. несколько незначительных ремарок(для новичков в программировании они могут быть полезны): 1. Возраст на английском "age" (old - это прилагательное "старый"... мне на протяжении ролика очень сильно резало слух) 2. C точки зрения хранения таких данных, корректнее хранить дату рождения, а возраст рассчитывать от ДР 3. Если будет введен вес целым числом - это же не ошибка... ;)
@Работа-н9в6 ай бұрын
Стоп, а почему "How old are you?', когда спрашивают про возраст?
@estelliarONE6 ай бұрын
@@Работа-н9в По сути вариант с "How old are you?" - Подразумевает "Насколько ты стар(а)" - Просто прижилась такая формулировка. Но ещё используют и вариант по типу: "What's your age?" но гораздо реже первого
@sedoy_dedushka5 ай бұрын
по поводу 3 пункта тоже так подумал и использовал при проверке if not isinstance(weight, (int, float))
@Ruslan5019 ай бұрын
Маэстро, отличное объяснение. Отличный пример!
@alexanderg90892 жыл бұрын
Отлично показаны best practices , да еще на пальцах. Спасибо! Сергей, понимаю, что это примеры обучающие примитивные. Но можно предлагать альтернативные варианты проверок для самостоятельного обучения. Например проверку допустимых символов через множества. Форма серии номера паспорта через регулярные выражения. Реализовывать не надо, просто пометку ....тут можно по другому, это задание на 5+, кто чувствует силы попытайтесь сами, нет - пропустите.
@tranklukatorz3 жыл бұрын
Мое почтение за ваши труды!!
@nailnail10002 жыл бұрын
Спасибо, Сергей, за крутой урок!
@sofiipochta4 ай бұрын
Спасибо, посмотрела!
@a_n_gel-j6m2 жыл бұрын
Супер!! Спасибо! Теперь все по полочкам разложилось))))
@andredru427810 ай бұрын
Спасибо. Уже привык к понятным объяснениям.
@python_953 жыл бұрын
давно ждал таких уроков. Спасибо большое
@he4esystem494 Жыл бұрын
Отличный урок. Спасибо!
@Lex122433 жыл бұрын
Спасибо автору, очень подробное изложение материала
@sergeigaribzyanov60612 жыл бұрын
Я в восторге!!! Огромное спасибо тебе!
@ОлегТруе3 жыл бұрын
Ваши классы просто класс 👍
@freeforrussia3 жыл бұрын
Спасибо, давайте ещё про классы!
@aleksandrsemenov17642 жыл бұрын
Самое сложно было понять, почему в конце убрали __ перед свойствами. self.item внутри __init__ - это имя нашего объекта property. То есть мы просто вынесли присваивание self.item = __item в сеттер.
@ymnop96522 жыл бұрын
Я правильно понял что скажем с примером old. self.old = old эта команда вызывает сеттер @old.setter в котом и проходит проверка? И это всё происходит потому что у сеттера приоритет выше?
@ivanivanovich9752 жыл бұрын
@@ymnop9652 я тоже полез в комменты за поиском ответа. Скорее всего вы правы, дело в высшем приоритете сеттера, а значит переопределить значение обратившись напрямую к свойству не получится, только через сеттер
@web44532 жыл бұрын
спасибо! живите 100 лет
@ISAWER1 Жыл бұрын
лайк и комментарий в поддержку канала
@андрейхоменко-и5я3 жыл бұрын
Браво... Прекрасный материал...
@Developer_python_ Жыл бұрын
За последний штрих особый лайк-думал скажете или нет))))
@beardedman72111 ай бұрын
Доброго времени суток. Во время просмотра видео у меня возник один вопрос, объясните пожалуйста, кто знает. Для чего мы делаем свойства приватными, а затем с помощью property даем доступ к этим свойствам пользователям? Почему нельзя просто взять и изначально сделать свойство old, общедоступным? То есть по факту мы с помощью property "отменили" приватность свойства old, так как теперь мы можем и записывать и извлекать значение.
@gta_KaskaD3 жыл бұрын
Супер, спасибо большое.
@AS-th7xe Жыл бұрын
Здравствуйте, вопрос: а где идёт проверка возраста, веса, паспорта мы же не используем атрибуты класса, не лучше ли использовать staticmethod?
@Watcherfromfar11 ай бұрын
Спасибо большое за этот урок! Все понятно, особенно понравился последний штрих. Мне показалось это изящным) Но при этом же, возникло пару вопросов - а удобно ли это, когда у тебя все приватные переменные класса раскиданы по куче функций? Не возникает ли путаница, приватный метод задан в __init__ или нет? Ведь условное self.old = old выглядит как обычное, неприватное свойство, пока не изучишь код этого класса. Или это неважно? Типа так и рассчитано, чтобы чужой разработчик не лез куда не надо)) Вот у тебя свойство, им и пользуйся. Надеюсь, мои вопросы не сильно глупые.
@ДимычДимон-г3ю Жыл бұрын
setter и property это как перегрузка оператора = в c++
@Arsenator-b3n5 ай бұрын
а почему нельзя использовать обычные функции без декоратора классметод? Мы же просто меняем ссылку на экземпляр на ссылку класса
@ИгорьЖуков-ч4б3 жыл бұрын
Сергей, спасибо большой за практический пример! Единственно, мне кажется, что все эти валидации можно было бы в несколько раз короче написать через регулярные выражения)) Или тут смысл в том, чтобы более гибко классифицировать ошибки?
@sedoy_dedushka5 ай бұрын
Когда мы создавали сеттеры и геттеры (идентичные по наполнению и различные только именем переменной), возникла мысль, что можно создать некую функцию, которая будет автоматически создавать в моменте сеттер и геттер по использованному при вызове аргументу (чтобы не дублировать для каждого аргумента сеттер и геттер) такое действительно можно реализовать?
@SayXaNow4 ай бұрын
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)
@nik01aich2 жыл бұрын
четко и по делу!
@pokerpoker48653 жыл бұрын
Спасибо за отличный плейлист! Сколько всего видео планируете снять?
@meganfox543 жыл бұрын
Спасибо за урок
@non53092 жыл бұрын
в самом конце немного не понятно, почему когда удаляли __ у аргументов, это сразу значило что будет выполнятся проверка аргументов на условия в сеттерах?
@selfedu_rus2 жыл бұрын
два подчеркивания - это локальное свойство, а без них - объект property, что мы определили
@zakirovio Жыл бұрын
Добрый день. Не могу разобраться как кратко и четко описать property. Правильно ли будет сказать, что главной опцией объектов property является создание общего имени для сеттера, геттера или делитера, которое хранит ссылки на них и через это имя, в зависимости от используемого оператора (присвоения, удаления, отсутствия оператора) можно вызвать нужный метод?
@TSM_149 Жыл бұрын
Спасибо за курс. Есть один вопрос. Почему бы не использовать для проверки паспортных данных regular expressions.
@selfedu_rus Жыл бұрын
да, вполне можно, просто это отдельный модуль и далеко не все им умеют пользоваться
@sladge173 жыл бұрын
letters сразу можно было сделать атрибутом класса, тогда он не будет заново пересчитываться при создании нового экземпляра.
@МаксимЛеднев-ь5ф2 жыл бұрын
Отличный плейлист! Спасибо большое за уроки. Я не очень понимаю, почему всё эти проверочные методы это классовые методы. В моём понимании их функционал не задействует ни классовые атрибуты, ни атрибуты экземпляров класса, то есть имеет смысл сделать их статическими. Так ли это или я чего-то не понимаю?
@selfedu_rus2 жыл бұрын
Спасибо! Здесь учебный пример для демонстрации, чтобы вы знали возможности языка. Всегда делайте обычные методы, а если возникнет необходимость, то уже задумайтесь над другими типами.
@SemyonKalyakulin2 жыл бұрын
в случае с методом verify-fio, надо делать classmethod, т.к. там используются константы класса, а в остальных методах - да, статики
@8dimaximym8 Жыл бұрын
Вы переодически используете метод type(). Читая книгу по Python, автор показывал этот метод, но всегда говорил, что лучше не использовать его, так как тем самым мы ограничиваем принципы динамической типизации. Как считаете, прав ли автор, не считается ли это плохим тоном программирования на Python?
@selfedu_rus Жыл бұрын
Если брать isinstance(), то например, для типа bool будет проходить и тип int, так как bool наследуется от него. А вот type() отработает четко. Все зависит от задачи.
@jamjam3337 Жыл бұрын
Спасибо
@rasik-74622 жыл бұрын
у меня вопрос, а можно ли в данном примере использовать для проверки декоратор staticmethod? не совсем понимаю почему тут используем classmethod
@selfedu_rus2 жыл бұрын
да, верно, если нет обращений к атрибуту класса, то staticmethod достаточно и предпочтительно
@rasik-74622 жыл бұрын
@@selfedu_rus спасибо!
@alexanderdickson1679Ай бұрын
Видно что не тугодум, обьяснения качественные, только какие задачи с этими методами можно решать, как практически применять все это?
@rollsave864210 ай бұрын
Здравствуйте, а случаем ли не избыточная проверка на len(s) < 1? Просто при split уже отсекаются строки с нулевым значением. Если нет, то приведите пример
@selfedu_rus10 ай бұрын
лучше сделать для надежности последующего редактирования программы; если на все полагаться, то малейшие изменения в коде приведут к большим непредвиденным ошибкам
@SayXaNow10 ай бұрын
Такое имеет место быть конкретно в этом примере, в случае сплита по вайтспейсу без параметра. На практике, очень часто, например, при парсинге CSV или табулированных таблиц, разделители уже конкретные, и пустые строки возникают сплошь и рядом. Поэтому, в случае обработки табличного вида данных, проверки на пустые строки не то что не лишние, а просто необходимы, в силу того, что обычный сплит без параметра там как правило не применяется. Ну, а если случай тривиальный, и точно уверен, что разделителем всегда будет пробельная последовательность - то да, тут пустых строк не может быть.
@rollsave864210 ай бұрын
@@SayXaNow а ну кстати да, почему-то сразу не подумал про то что сплитовать придется не только по пробелам, так программа более универсальная получается, спасибо!
@iliyanivanov66063 жыл бұрын
Супер
@abrorizzatullaev8362 жыл бұрын
Great
@Davidianable8 ай бұрын
Можно тупой вопрос? Почему в коде этого урока нет собственно декоратора property? Хотя в названии ролика он есть
@PythonSthenics7 ай бұрын
Есть декоратор. Ты точно всё видео смотрел?
@Davidianable7 ай бұрын
@@PythonSthenics Пересмотрел и действительно - есть. Извиняюсь, был не прав. Видимо это эффект от обучения - смотрю как баран на новые ворота, в упор многое не замечаю.
@dubinin_s3 жыл бұрын
Спасибо за видео. Скажите, а свойства класса S_RUS и S_RUS_UPPER не лучше сделать приватными и обращаться к ним через соответствующий геттер? Заранее спасибо.
@selfedu_rus3 жыл бұрын
Да, только обращаться напрямую, т.к. мы же внутри класса с ними работаем.
@dubinin_s3 жыл бұрын
@@selfedu_rus ну да, логично. Спасибо за ответ.
@hf0jgghhh4276 ай бұрын
Не понимаю. Мы специально сделали поля с __ чтобы к ним нельзя было добраться извне, а теперь делаем так чтобы это было можно сделать?
@selfedu_rus6 ай бұрын
к полям __ нельзя обращаться извне (это не защита от злоумышленника, а предупреждение для программиста), внутри методов класса можно
@hf0jgghhh4276 ай бұрын
@@selfedu_rus это я понял. Но мы же их делали для инкапсуляции. То есть чтобы программист, который будет работать с нашим классом знал, что данное поле должно быть использовано внутри класса и работать с ним извне не надо(на сколько я понял) . Но теперь с помощью property мы делаем так чтобы могли обращаться к этим полям извне. Пока писал появилось предположение. Это для того чтобы мы могли читать и записывать их каким то особым образом через методы для добавления и чтения?
@luispakvard56812 жыл бұрын
Для паспорта и ФИО легче регулярку написать чем сложные методы городить с разбором строк
@playt_pythonlearn2 жыл бұрын
все в учебных целях
@emigrate899 ай бұрын
Я запутался, помогите! В предыдущем уроке сказано, что @property применяется для того, чтобы не плодить def get_ и def set_ для каждого атрибута. Но в этом видео мы так-же создаем геттер и сеттер для каждого атрибута, но еще и с доп строкой в виде @property или @.setter. Смысл?
@SayXaNow9 ай бұрын
Не совсем верно. 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()) - применение нашего собственного метода.
@forsakenwing59893 жыл бұрын
Здравствуйте! Хотел уточнить, в плане структуры не лучше было создать дочерний класс с валидацией этих данных и поместить его в другой файл?(А в основной - этот, импортировать)
@selfedu_rus3 жыл бұрын
Если валидация привязана исключительно к данным класса Person, то городить огород из иерархий не вижу смысла. Если у вас планируется некий универсальный проверочный класс, то можно реализовать его как миксин.
@vadimnosurname2 жыл бұрын
почему не статикметод используется для проверки возраста и веса?
@selfedu_rus2 жыл бұрын
да лучше статик
@ИльмирШарифуллин-щ7т3 жыл бұрын
я немного не понял, для чего здесь строчка @classmethod? Почему нельзя было делать без нее с помощью обычных функций?
@selfedu_rus3 жыл бұрын
Можно. Но обычные методы первым параметром принимают self, а здесь нам это не нужно. Поэтому и прописал @classmethod
@SweetyMeowwwwwww11 ай бұрын
я не могу понять, зачем вы проверяете наличие минимум 1 символа, хотя перед этим проверяли наличие 3 элементов, ведь если будет меньше 1 символа, то наверное будет меньше 3 элементов, разве нет?
@selfedu_rus11 ай бұрын
!= 3 - это 0, 1, 2, 4, ...
@Receive_2 жыл бұрын
Назрел вопрос. Если я буду пользоваться не @classmethod а обычным методом, но в параметре укажу cls - эту будет считаться плохим тоном или из этого в будущем можно получить ошибку. В данной программе все работает без ошибок.
@selfedu_rus2 жыл бұрын
работать будет без ошибок, но да, это плохой тон ))
@Receive_2 жыл бұрын
@@selfedu_rus Классно, что есть обратная связь. Попытался доработать форму, чтобы можно было вводить данные не в коде а в консоли. Прописал строку g = Person(input(), input(), input(), input()), но программа пропускает числовые инпуты. Пробовал обернуть числовые int() и float(), выдает ошибку ValueError: invalid literal for int() with base 10: '' Подскажите что не так?
@selfedu_rus2 жыл бұрын
@@Receive_ функция int(val) может преобразовать только строки с целыми числами
@РустамРаджабов-ц3м10 ай бұрын
а зачем тут проперти, могли бы оставить просто так, просто чтобы вызов сеттера и геттера был публично обозначен и все что ли ??
@АлексейМедведев-г5ж Жыл бұрын
А не проще проверять корректность символов так: set(s) < set(letters)?
@selfedu_rus Жыл бұрын
да, это хороший подход, только здесь
@чимигечикарми-ч5т Жыл бұрын
Можно было проверять ФИО через регулярные выражения намного код проще стал бы
@konkotaro3 жыл бұрын
В волшебных методов __setatr, __getatr, __getatribute тоже можна писать проверки и так же использывать как Вы в этом уроке. Я понимаю, что можна писать по-разному, но эти волшебные методы тогда более пригодятся в более сложных примерах или можна так и так как нравится писать? Хочу научится понимать тонкости. Спасибо
@ДімаКуріптя Жыл бұрын
тоже интересно
@Jevelin4kNone Жыл бұрын
почему у меня в коде пишет ошибку с буквой s
@misha82802 жыл бұрын
12:42 Почему в сеттере не нужно возвращать новое значение? (self.__old = old, почему без return self.__old)?
@selfedu_rus2 жыл бұрын
сеттер только устанавливает параметр, возвращать ничего не требуется
@misha82802 жыл бұрын
@@selfedu_rus понял, спасибо)
@misha82802 жыл бұрын
@@selfedu_rus а еще вопрос. Курс на степике не планируете делать? А то вроде всё понятно, но хотелось бы закрепить. В интернете искал задачи, но пока что без успешно)
@selfedu_rus2 жыл бұрын
@@misha8280 просто времени нет, пока не до этого
@iliyanivanov66063 жыл бұрын
Можно использовать в classmetod вот так(если Python 3.10): @classmethod def verify_weight(cls, weight: int | float): if not isinstance(weight, int | float) or weight < 20: raise TypeError(".......") извините за мой руский, если есть ошибки.
@donfedor0073 жыл бұрын
текст про staticmethod, а код classmethod.....
@alexfin92 Жыл бұрын
А зачем метод валидации возраста, веса и паспорта декорированы как classmethod, он же с данными класса не работают. И их поидее лучше staticmthod декорировать. И валидация ФИО тоже под вопросом. Данные класса же не изменяются, а только берутся для проверки символов, почему его простым методом не оставить. Мб я что-то не понимаю?
@selfedu_rus Жыл бұрын
согласен!
@bigsmilefriend2 жыл бұрын
В чем смысл проверки длины слова на
@selfedu_rus2 жыл бұрын
@bigsmilefriend2 жыл бұрын
@@selfedu_rus та не, я может неправильно написал. Напишите мне условие при котором мы вводим ФИО и выдает ошибку " в ФИО должен быть хотя бы один символ", пожалуйста, а то все равно не понимаю целесобразность этой проверки. Как по мне, она взаимоисключается при проверки на длину ФИО из 3 слов и что все символы буквы. СПАСИБО ВАМ, ЗА ВАШ ТРУД! Я хоть и не все понимаю, для меня не хватает домашних заданий....прям очень сильно!
@selfedu_rus2 жыл бұрын
@@bigsmilefriend курс на Stepik делаю, недели 2-3 и будет
@veraburak80492 жыл бұрын
Святой чел
@vitaliykhomenko26694 ай бұрын
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя-' Это должен быть первый коментарий)
@sidorovich211019863 жыл бұрын
А для нужен был декоратор @classmethod? Вы же говорили, что @classmethod используется в основном для статических методов. Ещё хотел сказать из опыта, что отчество всегда должно быть необязательным полем, так как у некоторых народов отчество является частью имени (поэтому отчество у них отсутствует), например, у монголов, тюрков и т. д.
@selfedu_rus3 жыл бұрын
Через @classmethod мы описываем методы, которые работают только с атрибутами класса, а не его экземпляров. С отчеством да, согласен, ну это учебный пример )
@orthodox-chanel2 жыл бұрын
чтобы не прописывать все символы которые мы хотим проверить можно еще так прописать проверку через регулярные выражения import re if re.search(r'[^А-Яа-яЁё\s\-]', fio) != None: raise TypeError('Допустимы только Буквы, тире и пробел!')
@RealMineManUK Жыл бұрын
Так же подумал и сделал, но вот вопрос, класс же теперь за собой тянет Re модуль, и нельзя им воспользоваться его нţимпортируя. Как вы думаете, имеет ли это значение?
@yaroslavchekomasov9918 Жыл бұрын
Вместо "А-Яа-яЁё" работает "Ё-ё" - ещё короче.
@yaroslavchekomasov9918 Жыл бұрын
@@RealMineManUK , ну модуль string Сергей импортирует без зазрений совести, так что не в том дело. re - тоже стандартная библииотека. Сергей писал, что regular expressions не использует, чтоб отдельно не объяснять, что это такое тем, кто не в курсе.
@АнтонВитальевич-т7к2 жыл бұрын
Не совсем понятно применение в данном примере методов класса (за исключением verify_fio, т.к. в этом методе есть обращение к атрибутам класса) Почему именно методы класса, а не статические методы?
@selfedu_rus2 жыл бұрын
строгих правил тут нет, но если мы в методе не собираемся работать с атрибутами объектов, то это кандидат на класс-метод. Статические вообще очень редко задаются и, как правило, это какие то сторонние вспомогательные функции, связанные как то с тематикой класса и не более того. С опытом придет понимание.
@АнтонВитальевич-т7к2 жыл бұрын
@@selfedu_rus спасибо за ответ! Пытаюсь понять когда что используется. Считал, что если не работаем ни с атрибутами класса, ни с атрибутами экземпляра класса, то это и есть безальтернативный вариант статического метода.
@tranklukatorz2 жыл бұрын
Созрел вопрос после просмотра лекций - Как сделать такой же единый интерфейс(сеттер, геттер) но чтоб сеттер мог принимать не одно значение а несколько? Я пробовал с помощью проперти но как я понял там можно передавать только одно значение.. Ну или если я что-то упустил то поправьте меня :)
@selfedu_rus2 жыл бұрын
через кортежи
@ibrahimoglu3 жыл бұрын
👍
@proskurlandsky2 жыл бұрын
Только непонятно зачем верификаторы делать методами класса.
@vitaliikorenevich93152 жыл бұрын
Сергей Михайлович, а Вам точно 30?
@if_be Жыл бұрын
Разве в программировании все начинается не с 0?
@Like_a_boosss Жыл бұрын
Это ты к чему?
@n0rmaLman3 жыл бұрын
Немного позанудствую. Возраст по английски будет age, а old - это старый. Но, в любом случае спасибо за урок.
@victorstelmashchuk48403 жыл бұрын
Пока досконально не проверял, но на первый взгляд в проверке ФИО есть загвоздка с пробелами. По логике они должны быть раз используется split без аргументов, но в verify_fio они не разрешены.
@victorstelmashchuk48403 жыл бұрын
Хотя похоже проглядел, что в русских буквах в конце стоит пробел. Так что все ОК.
@dmitrytsmyh5971 Жыл бұрын
Немного некрасиво использовать if type(fio) != str, в доках больше рекомендуется использовать isinstance.
@selfedu_rus Жыл бұрын
Все зависит от задачи. Здесь да, можно isintance, но вот для проверки булевых величин isintance может возвращать неверный результат, т.к. выполняет определение типа с учетом наследования. Функция type более строгая.
@freegigganigga2 жыл бұрын
1:08 а если я Хасбик?)
@nikolaydemchenko674111 ай бұрын
Это такая своя традиция когда пишешь на питоне, называть переменные одной буквой, чтоб через пять минут не помнить, что это? Не у первого автора это вижу, глаза режет и душу рвёт.
@Majohne11 ай бұрын
В данном случае это такой проект, который на след день не понадобится, поэтому так можно
@nikolaydemchenko674111 ай бұрын
@@Majohne можно показывать как делать не правильно, но не предупреждая, что это не правильно? По этой логике потом люди так же код и пишут, как увидели.
@Majohne11 ай бұрын
@@nikolaydemchenko6741 вряд-ли человек будет изучать ООП, если не изучил базу языка, в уроках которой обычно это все объясняют. Хотя мб есть и такие, кто при объяснении самого языка это используют и не говорят об этом
@nikolaydemchenko674111 ай бұрын
@@Majohne если ты пишешь код, и много, ты не будешь страдать такой ерундой типа тут и одной буквой сойдёт. У тебя в голове такое не возникнет в принципе, ты просто назовешь переменную максимально понятно и не будешь об этом вообще думать. И в этом курсе не совсем про ООП. Тут про реализацию классов и объектов в данном языке. Хотя многие думают, что это уже ООП.
@playt_pythonlearn2 жыл бұрын
13:20
@ЯрославБеляев-т5к3 жыл бұрын
Бедный Сергей Михайлович... 70 лет проработал в одной организации...
@МамонтовОлег-в9о3 жыл бұрын
ёкарный бабай!
@LordRimus2 жыл бұрын
Где-то в мире заплакала одна Жанна Кальман.
@asilbekmirolimov74302 жыл бұрын
какая разница между @classmethod и без @classmethod
@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 Жыл бұрын
у тебя название функции verify_weght (пропустил "i")