Очень надеюсь Сергей, что вы услышите наши мольбы и выложите курс по ООП на степик. После этих видео просто чешуться руки и хочется закрепить тему на задачах.
Урок #6 = Пройден До этого видео, я уже смотрел этот урок, но в процессе, понял что многое не понимаю, и решил пройти сначала курс по Python Core. И вот я вернулся к этому же видео :) Опять же, так как я уже смотрел это видео, нечего нового не узнал, но был рад к нему вернутся, и "залатать" дыры в памяти :)
На Вашем канале наиболее доходчивая подача материала из тех, что мне пока встречались. Благодарю за проделанную работу и желаю успеха в любых Ваших начинаниях! :)
смотрел как то видео, там java разработчик ругал геттеры и сеттеры. теперь придется пересмотреть все заново что бы понять суть его претензии. Большое спасибо за труд!!!!
Privat методы - это обработчики для гетеров, сетеров и прочих функций (например, проверка, чтобы str значение не записывали туда, где цифры) Privat свойства - это переменные (часто это константы), которые нельзя менять просто так. Только внутриклассовыми методами. Privat атрибуты защищены от случайного вызова снаружи класса (они недоступны). Рассчитаны только на использование внутри класса и только внутри, без наследования и т.п. Protect свойства и методы - это служебные атрибуты класса, использовать можно снаружи, но на свой страх и риск, т.к. их могут изменить другие разработчики в любой момент. Protect свойства и методы - рассчитаны на использование как в классе, так и для наследования в другие классы.
Спасибо огромное, Сергей! Ваши уроки довольно исчерпывающие и развеивают в голове сложившиеся недопонимания и мифы, заполняют пробелы. Всё цельно и по полочкам)
Очень рад, что наткнулся на Ваш канал. Материал дается последовательно и все очень доходчиво объясняется. Еще радует, что почти в каждом видео есть фишки, которые раньше не встречал. Пусть Ваш образовательный запал не иссякает)
Оптимальный по продолжительноти и объёму информации ролик. Можно хоть десять раз пересмотреть и повторить вслед за автором в PyCharm-е пока не придёт его величество Понимание.
Огромное спасибо за этот материал, теперь я реально начал что-то понимать, сидишь, смотришь и прям кайфуешь как от уровня полного нуля приходит осознание =) тут реально все разложено как для детей, в других курсах просто жесть из стиля: это конструктор, это деструктор - идите творите и сидишь такой из стиля, а что делать то?)))))
9:37 А почему не staticmethod? Мы же делаем простую проверку входных чисел, которые не относятся ни к экземплярам, ни к классу? Или же это так, на случай вдруг в будущем запихнуть туда какие-то атрибуты класса?)
Судя по описанию, к атрибуту _protected есть доступ у дочерних экземпляров. Что и делалось в данном видео, но не совсем понятно в каких кейсах целесообразно использовать.
10:09 почему мы объявили __check_value как classmethod а не staticmethod? Ведь он не обращается к аттрибутам/методам класса, а работает с переданными параметрами
11:20 сделал проверку через уже имеющийся метод set_coord и обнаружил, что ему нужно сразу передать x и y без self, иначе интепртетатор ругается. Заметил, что с методом __check_value мы поступили также - не передали при вызове cls, но тут метод класса. Не могли бы вы осветить данный вопрос? Все найденные объснения в гугле не содержат именно этого нюанса. Спасибо!
Все, что не подразумевается для выдачи пользователю (вне класса), следует помечать закрытым. Тогда открытые методы следует поддерживать в неизменяемом виде (в разных версиях класса), а закрытые можно изменять (сигнатуру и функционал).
Полистал комментарии, ответа на свой вопрос не увидел. А он вот в чем. Мы изначально имеем метод __init__, в котором есть self.__x = 0, self.__y = 0. Далее объясняется что для изменения этих значений нужно создать отдельный set_coords, который будет уже заменять значения по вызову внешней ссылки pt.set_coords(1, 2). Но почему мы не можем просто взять тот же __init__ и написать условное pt.__init__(1, 2)? Замена происходит также как и при создании сеттера. Не могу понять смысла этого дополнительного действия
>Но почему мы не можем просто взять... Потому что для этого есть специальные методы и нужно использовать их. Питон просто допускает возможность выстрелить себе в ногу разными путями, но автором и документацией сразу оговаривается, что не надо так делать т.к. по какой-либо причине могут убрать __init__ из кода и придётся перепиливать куски кода Кратко говоря: не надо ломать стекло, чтобы проветрить комнату
попробуйте более жизненную задачу - например есть сайт вакансий/фильмов/книг (не важно), на котором нет фильтрации/сортировки или фильтрация работает как-то не так как хотелось бы. Спарсить это все и вывести. Сделать на ооп и без.
недопонимание на Private инкапсуляции:на примере 4:43, у нас есть class Point: def __init__(self, x=0, y=0): self.__x = x self.__y = y Ошибка на выполнении print(pt.__x, pt.__y). Но разве 'pt' не находится внутри класса Point? При этом далее, при присвоении и возврате значений методами set_coord и get_coord через экземпляр pt, значения успешно присвоены и возвращены (тут логично, экземпляр pt и другие возможные внутри одного класса вроде как)
или там логика в том, что для set_coord и get_coord мы присываем атрибуты именно переменным x, y в (self, x, y) , которые в свою очередь дают значение инкапсулированным __x и __y в (self.__x, self.__y). Если это всё так, то остался вопрос: pt находится внутри класса Point? 🙃
в функции def __check_value(cls, x): можно писать и def __check_value(self, x): тем более, что работаем с экземпляром класса pt -> pt.set_coord(10,20). Зачем все таки писали cls в параметре, если работает и self ?
Досмотрел до того места где рассказывается о том, что одно нижнее подчеркивание никак не модефицирует доступ к полю класса и по сути не делает его protected, а является 'сигналом' для программиста... после cpp это просто уже кровь из глаз... Сейчас немножко отойду и дальше смотреть буду. :) Python конечно странный язык. :)
Не понял, зачем или по какой причине check_value определили методом класса? Что это дало, он же работает с параметрами передаваемыми в экземпляр при инстанцировании? Почему это метод класса тогда (если работает с параметрами. переданными на вход через экземпляр при инстанцировании, а не с внутренними каким-то полями самого класса)
check_value работает с данными, которые ему передаются через параметры, а не напрямую с атрибутами объекта класса, поэтому его вполне можно сделать методом класса; если сделаете обычным методом, ошибки не будет
Здравствуйте! Поясните, пожалуйста, такой момент. После добавления двух символов _ _перед переменной, ее нельзя вывести в принт, через внешнюю ссылку pt.__x. Но при этом, атрибут легко меняется по внешней ссылке, например, pt.__x = 9.(без всяких сеттеров). А после такой замены ( хотя она вроде как не должна работать), переменная с двумя подчеркиваниями легко выводится в принт через ту же самую команду pt.__x Почему так?
Интересный моменты вы отметили )) Но объясняется очень просто. Когда извне создаете локальный объект (с любым именем), то он создается как глобальный. То есть в строчке pt.__x = 9 создается новый локальный атрибут с именем __x. Когда же мы внутри класса создаем self.__x, то имеем другой локальный атрибут (приватный), но он имеет также глобальное имя _имякласса__x. Вы можете в этом убедиться, распечатав: print(pt.__dict__). Там у вас будет дополнительный атрибут глобальный __x
@@selfedu_rus Спасибо большое за пояснения! В целом понятно! Не совсем ясно только, в чем тогда защита переменных. Ведь получается, мы создаем объект класса командой pt = Point(1, 1) . При этом через __init__ этому создаваемому объекту pt присваиваются 2 новых локальных атрибута self.__x и self.__y (это же считается как создание внутри класса?). И эти параметры недоступны по внешней ссылке pt. Но, решив поменять значения, написав pt.__x = 9, они получается становятся глобальными и легкодоступными? В чем тогда защита...Или для защиты тогда нужно обязательно использовать __setattr__?
@@selfedu_rus вроде понятно, а вроде и не до конца. Получается у объекта pt появляется 2 атрибута, pt.__dict__ выводит их { '_Point__x' : 1, '__x' : 9 }. Видимо один локальный, который определен внутри класса. А второй глобальный, так? Это по аналогии с локальными и глобальными пространствами имен у функций?
@@Юрий-х5о5щ нет, посмотрите занятие по Python ООП, где я рассказываю про разграничение доступа: proproprogs.ru/python_oop/rezhimy-dostupa-public-private-protected-settery-i-gettery
Сергей, допустимо ли в конструкторе класса __init__ делать так? Чтобы сразу делать проверку class Point: def __init__(self, x = 0, y = 0): self.set_coord(x, y)
да, даже предпочтительно, только начальные значения локальных атрибутов self.x, self.y нужно создать, иначе если проверка не пройдет (в сеттере) локальных атрибутов не будет (обычно присваивают некие начальные значения)
@@selfedu_rus Только если запускать файл и давать изначально значения не проходящие проверку , то уже следующая строка не запускает метод , например метод get_coord для проверки , что были установлены значения 0 , 0. Так как сработало исключение. Если запускать в консоли и делать то же самое поочередно , то все работает
Благодарю за урок. На 14.13 не понял почему убрали двойные подчёркивания у названия метода, но не убрали у названия атрибутов этого метода. Если атрибуты приватны, то и название метода было бы полезно указывать как приватное.
Так мы там используем декоратор @private, чтобы сделать его приватным. Убираю подчерктвание, чтобы продемнстрировать, что он действительно приватным становится.
Почему в разных источниках про protected дают разную инфу? В одних говорят что зона действия Класс и его Наследники. А в других - Модуль и даже Пакет. Что же правильно в итоге???
Что то не пойму, кто знает помогите, или кто понял. В методе def __init__(self, x=0, y=0) - начальные значения же здесь указаны? Зачем ниже строчка - self.__x = self.__y = 0?
@@selfedu_rus Создаются они строкой self.x = x? А тут наверно задаются значения локальным свойствам класса, которые применяются когда введено не верное значение в экземпляре класса, при вызове метода класса? Если более детально в строке init - значение по умолчанию(x = 0, y = 0), в экземпляре класса в строке pt = Point(1, 2) - присваиваются новые значения и если они не пройдут проверку(__check_value), то тогда работает строка self.__x = self.__y = значение которое будет присвоено, хоть строка.
может я не понял, но когда мы пишем print(pt.__x), то выходит ошибка (как и должно быть). Но в то же время мы можем написать pt.__x = 500 и программа отработает. ну и если смотреть переменные в консоле, то там вообще всё запутывается ещё больше. спасибо.
Читаю комментарии после просмотра видео несколько раз, и понимаю что походу тут самый непонятливый это я:( Что означает эта защита. Защита от кого или от чего?))
Защита от доступа "извне" (для программиста, который это будет использовать); защита от наследования и т.д. Только "защита" несколько условная, скорее, указание программисту, что этот метод или переменную трогать не надо, она для внутренней кухни класса ))
Подскажите, пожалуйста, можно ли в пользовательском классе, подобно встроенным классам, сделать полную защиту от внешнего вмешательства (относительно всего - добавления, изменения или удаления свойств экземпляров класса и свойств и методов самого класса)?
@@selfedu_rus Но тогда не очень понятно, если защиту можно сконструировать при помощи магических методов, зачем нужны эти режимы доступа? Например, тот же запрет на прямое (не через сеттер) изменение какого-либо свойства экземпляра класса можно прописать в методе __setattr__ , не обращаясь к private. И, по-моему, так даже надежнее (может, я чего-то не знаю). Объясните, пожалуйста.
можете сказать зачем здесь @classmethod если можно было просто написать без него (ваще не разобрался зачем нужен classmethod, только если брать переменные класса и все, сколько я б не перечитывал инфы зачем он нужен, я все равно так и не понял)
Очень надеюсь Сергей, что вы услышите наши мольбы и выложите курс по ООП на степик. После этих видео просто чешуться руки и хочется закрепить тему на задачах.
Два чаю этому господину. Поддерживаю
Ищем на степике Добрый, добрый Python ООП - обучающий курс от Сергея Балакирева
-Ты приватный метод?
- нет, я волшебный))
Величина таланта преподавателя зашкаливает! Умнейший человек
Урок #6 = Пройден
До этого видео, я уже смотрел этот урок, но в процессе, понял что многое не понимаю, и решил пройти сначала курс по Python Core. И вот я вернулся к этому же видео :)
Опять же, так как я уже смотрел это видео, нечего нового не узнал, но был рад к нему вернутся, и "залатать" дыры в памяти :)
На Вашем канале наиболее доходчивая подача материала из тех, что мне пока встречались. Благодарю за проделанную работу и желаю успеха в любых Ваших начинаниях! :)
Ну наконец-то доходчиво человек объяснил для не самых умных :) спасибо!
У вас синдром "Самозванца"
смотрел как то видео, там java разработчик ругал геттеры и сеттеры. теперь придется пересмотреть все заново что бы понять суть его претензии. Большое спасибо за труд!!!!
Спасибо Сергей за великолепный урок. Всё понятно и обстоятельно! Рад что вы взялись за обновление ООП.
Privat методы - это обработчики для гетеров, сетеров и прочих функций (например, проверка, чтобы str значение не записывали туда, где цифры)
Privat свойства - это переменные (часто это константы), которые нельзя менять просто так. Только внутриклассовыми методами.
Privat атрибуты защищены от случайного вызова снаружи класса (они недоступны). Рассчитаны только на использование внутри класса и только внутри, без наследования и т.п.
Protect свойства и методы - это служебные атрибуты класса, использовать можно снаружи, но на свой страх и риск, т.к. их могут изменить другие разработчики в любой момент.
Protect свойства и методы - рассчитаны на использование как в классе, так и для наследования в другие классы.
Сергей, спасибо Вам огромное за этот бесценный материал! Очень системно и понятно объясняете, одно удовольствие изучать! 🤗
Вы просто гений в объяснении. От используемых слов до самого произношения. Очень уместно расставлены акценты . Смотришь как кино. Спасибо!
Спасибо огромное, Сергей! Ваши уроки довольно исчерпывающие и развеивают в голове сложившиеся недопонимания и мифы, заполняют пробелы. Всё цельно и по полочкам)
Казалось бы, предыдущий плейлист по ООП на этом канале отличный. Но даже здесь Сергей смог улучшить и добавить новых полезностей. Спасибо за труд!
а потом еще лучше будет!
Сергей, спасибо за такой не легкий труд, за такое понятное и доходчивое объяснение
Сергей, спасибо за понятные и полные объяснения! Раньше классы для меня были чем-то сложным и пугающим, сейчас пока всё понятно :)
Очень рад, что наткнулся на Ваш канал. Материал дается последовательно и все очень доходчиво объясняется. Еще радует, что почти в каждом видео есть фишки, которые раньше не встречал. Пусть Ваш образовательный запал не иссякает)
Оптимальный по продолжительноти и объёму информации ролик. Можно хоть десять раз пересмотреть и повторить вслед за автором в PyCharm-е пока не придёт его величество Понимание.
Огромное спасибо за этот материал, теперь я реально начал что-то понимать, сидишь, смотришь и прям кайфуешь как от уровня полного нуля приходит осознание =) тут реально все разложено как для детей, в других курсах просто жесть из стиля: это конструктор, это деструктор - идите творите и сидишь такой из стиля, а что делать то?)))))
Это самое лучшее и, по сути, единственное объяснение, которое помогло мне лучше всего разобраться в сеттерах и геттерах. Спасибо!
уроки конечно отличные, но ваш коммент приятнут за уши, про сеттеры и геттеры тут как раз упомянуто вскользь. автору спасибище!!!
@@diekunstUA Мне помогло - вот и все) Говорю искренне
ОЧЕНЬ понятно объясняете, спасибо вам огромное, Сергей!
Сергей, огромное спасибо за Ваши труды🙏
Сергей, спасибо большое за видео! Очень понятно все рассказываете! Было бы очень здорово, если бы у вас было больше тем с задачами на Степик)
Спасибо, посмотрела!
Сергей, спасибо Вам огромное за эти уроки! Очень жду курс на Степике!
Как всегда доступно и грамотно!
Сергей, спасибо большое за урок!
спасибо, очень информативный урок
9:37 А почему не staticmethod? Мы же делаем простую проверку входных чисел, которые не относятся ни к экземплярам, ни к классу? Или же это так, на случай вдруг в будущем запихнуть туда какие-то атрибуты класса?)
Сергей, благодарю! 👍💯
Спасибо. Круто. Понравилось.
Ещё сеттеры могут быть полезны, если необходимо добавить некие вычисления.
максимлаьно полно, просто и доступно
Отличный урок!
Спасибо за лучшие объяснения на русском!
P.S. Читается "аксе́сифай" :)
Спасибо большое!
Спасибо за урок
Это было слижком жёстко, но я смог это сделать. Написал класс Нереварин, в котором скрывал его левл и хары
лайк и комментарий в поддержку.
Судя по описанию, к атрибуту _protected есть доступ у дочерних экземпляров. Что и делалось в данном видео, но не совсем понятно в каких кейсах целесообразно использовать.
с одним подчеркиванием прямо джентельменское соглашение - если хочется, то можно
какая жэсть) ради интереса сравните как работают модификаторы доступа к свойствам и константам класса в php 8
🙏 Спасибо!
Спасибо за уроки 🖖👍
Спасибо!!!
Приветствую Сергей спасибо за видео, очень ясно и познавательно. Подскажите предыдущий блок про ООП устарел или все же актуален?
лучше смотреть этот курс, в том есть недочеты, я его со временем уберу
10:09 почему мы объявили __check_value как classmethod а не staticmethod? Ведь он не обращается к аттрибутам/методам класса, а работает с переданными параметрами
да, здесь вполне подойдет статик
мой мозг взорвался :D
11:20 сделал проверку через уже имеющийся метод set_coord и обнаружил, что ему нужно сразу передать x и y без self, иначе интепртетатор ругается. Заметил, что с методом __check_value мы поступили также - не передали при вызове cls, но тут метод класса. Не могли бы вы осветить данный вопрос? Все найденные объснения в гугле не содержат именно этого нюанса. Спасибо!
Получается немного дублирования в сеттере, если мы определили входные параметры в __init__
Здравствуйте! А почему вы создали __check_value через classmethod, а не через обычный метод?
Все, что не подразумевается для выдачи пользователю (вне класса), следует помечать закрытым. Тогда открытые методы следует поддерживать в неизменяемом виде (в разных версиях класса), а закрытые можно изменять (сигнатуру и функционал).
Полистал комментарии, ответа на свой вопрос не увидел. А он вот в чем. Мы изначально имеем метод __init__, в котором есть self.__x = 0, self.__y = 0. Далее объясняется что для изменения этих значений нужно создать отдельный set_coords, который будет уже заменять значения по вызову внешней ссылки pt.set_coords(1, 2). Но почему мы не можем просто взять тот же __init__ и написать условное pt.__init__(1, 2)? Замена происходит также как и при создании сеттера. Не могу понять смысла этого дополнительного действия
>Но почему мы не можем просто взять...
Потому что для этого есть специальные методы и нужно использовать их.
Питон просто допускает возможность выстрелить себе в ногу разными путями, но автором и документацией сразу оговаривается, что не надо так делать т.к. по какой-либо причине могут убрать __init__ из кода и придётся перепиливать куски кода
Кратко говоря: не надо ломать стекло, чтобы проветрить комнату
Можно было воспользоваться isinstance при формировании условий в методах?
14:20 подскажите пожалуйста как вы быстро убрали два подчеркивания? какие горячие клавиши PyCharm использовали
это магия монтажа )))
@@selfedu_rus серьёзно? хм...
вопрос: через код-имени можно даже под защитой эксифай достать свойство?
Здравствуйте. А не подскажите где можно взять задания для отработки ООП , в степике его так мало ,а вот вебе его весьма много ,не меньше чем циклов .
попробуйте более жизненную задачу - например есть сайт вакансий/фильмов/книг (не важно), на котором нет фильтрации/сортировки или фильтрация работает как-то не так как хотелось бы. Спарсить это все и вывести. Сделать на ооп и без.
недопонимание на Private инкапсуляции:на примере 4:43, у нас есть
class Point:
def __init__(self, x=0, y=0):
self.__x = x
self.__y = y
Ошибка на выполнении print(pt.__x, pt.__y). Но разве 'pt' не находится внутри класса Point?
При этом далее, при присвоении и возврате значений методами set_coord и get_coord через экземпляр pt, значения успешно присвоены и возвращены (тут логично, экземпляр pt и другие возможные внутри одного класса вроде как)
или там логика в том, что для set_coord и get_coord мы присываем атрибуты именно переменным x, y в (self, x, y) , которые в свою очередь дают значение инкапсулированным __x и __y в (self.__x, self.__y).
Если это всё так, то остался вопрос: pt находится внутри класса Point? 🙃
pt - это внешняя ссылка на объект класса Point
только, наверно, лучше статический, а не класса
@staticmethod
def __check_value(x):
return type(x) in (int, float)
Сергей, допустимо ли в методе __init__ для исключения дублирования кода, вызвать метод set_coords?
да и это хорошая практика
в функции def __check_value(cls, x): можно писать и def __check_value(self, x): тем более, что работаем с экземпляром класса pt -> pt.set_coord(10,20). Зачем все таки писали cls в параметре, если работает и self ?
__check_value() не работает с self, туда передается параметр, он проверяется (можно вместо classmethod взять staticmethod будет лучше)
👍👍👍👍👍
а где можно дополнительно прочитать в каких случаях рекомендуется использование тех или иных режимов доступа?
@@AntonyKondr ок
Досмотрел до того места где рассказывается о том, что одно нижнее подчеркивание никак не модефицирует доступ к полю класса и по сути не делает его protected, а является 'сигналом' для программиста... после cpp это просто уже кровь из глаз... Сейчас немножко отойду и дальше смотреть буду. :) Python конечно странный язык. :)
Обратился к двум подчеркиваниям вне класса - сам себе страшный Буратино!
А почему так в питоне устроено все? Почему можно все таки к private атрибутам обращаться? Есть какой-то аргумент в пользу этого?
По задумке (Гвидо Ван Россума) все должно быть явным, никаких скрытых факторов. Здесь доступ к закрытым свойствам - на совести программиста.
Не понял, зачем или по какой причине check_value определили методом класса? Что это дало, он же работает с параметрами передаваемыми в экземпляр при инстанцировании? Почему это метод класса тогда (если работает с параметрами. переданными на вход через экземпляр при инстанцировании, а не с внутренними каким-то полями самого класса)
check_value работает с данными, которые ему передаются через параметры, а не напрямую с атрибутами объекта класса, поэтому его вполне можно сделать методом класса; если сделаете обычным методом, ошибки не будет
@@selfedu_rus а, стало яснее, спасибо! Эту разницу между данными, переданными в параметры, и сами атрибутами я упустил 😳
Сергей, будет ли курс по данной теме на Степике? Благодарю!
Посмотрим, пока незнаю.
Тогда как обращаться к методу check_value() который имеет декоратор @private @classmethod? Через имя класса Poin. ?
Вы имеете в виду режим доступа private? С нижним подчеркиванием? Проблем с доступом тут нет.
Здравствуйте! Поясните, пожалуйста, такой момент. После добавления двух символов _ _перед переменной, ее нельзя вывести в принт, через внешнюю ссылку pt.__x. Но при этом, атрибут легко меняется по внешней ссылке, например, pt.__x = 9.(без всяких сеттеров). А после такой замены ( хотя она вроде как не должна работать), переменная с двумя подчеркиваниями легко выводится в принт через ту же самую команду pt.__x Почему так?
Интересный моменты вы отметили )) Но объясняется очень просто. Когда извне создаете локальный объект (с любым именем), то он создается как глобальный. То есть в строчке pt.__x = 9 создается новый локальный атрибут с именем __x. Когда же мы внутри класса создаем self.__x, то имеем другой локальный атрибут (приватный), но он имеет также глобальное имя _имякласса__x. Вы можете в этом убедиться, распечатав: print(pt.__dict__). Там у вас будет дополнительный атрибут глобальный __x
@@selfedu_rus Спасибо большое за пояснения! В целом понятно! Не совсем ясно только, в чем тогда защита переменных. Ведь получается, мы создаем объект класса командой pt = Point(1, 1) . При этом через __init__ этому создаваемому объекту pt присваиваются 2 новых локальных атрибута self.__x и self.__y (это же считается как создание внутри класса?). И эти параметры недоступны по внешней ссылке pt. Но, решив поменять значения, написав pt.__x = 9, они получается становятся глобальными и легкодоступными? В чем тогда защита...Или для защиты тогда нужно обязательно использовать __setattr__?
@@Юрий-х5о5щ нет, вы создаете новый локальный атрибут, те защищенные остаются без изменений
@@selfedu_rus вроде понятно, а вроде и не до конца. Получается у объекта pt появляется 2 атрибута, pt.__dict__ выводит их { '_Point__x' : 1, '__x' : 9 }. Видимо один локальный, который определен внутри класса. А второй глобальный, так? Это по аналогии с локальными и глобальными пространствами имен у функций?
@@Юрий-х5о5щ нет, посмотрите занятие по Python ООП, где я рассказываю про разграничение доступа: proproprogs.ru/python_oop/rezhimy-dostupa-public-private-protected-settery-i-gettery
Сергей, допустимо ли в конструкторе класса __init__ делать так? Чтобы сразу делать проверку
class Point:
def __init__(self, x = 0, y = 0):
self.set_coord(x, y)
да, даже предпочтительно, только начальные значения локальных атрибутов self.x, self.y нужно создать, иначе если проверка не пройдет (в сеттере) локальных атрибутов не будет (обычно присваивают некие начальные значения)
@@selfedu_rus Спасибо, понял
@@selfedu_rus Только если запускать файл и давать изначально значения не проходящие проверку , то уже следующая строка не запускает метод , например метод get_coord для проверки , что были установлены значения 0 , 0. Так как сработало исключение.
Если запускать в консоли и делать то же самое поочередно , то все работает
Благодарю за урок.
На 14.13 не понял почему убрали двойные подчёркивания у названия метода, но не убрали у названия атрибутов этого метода. Если атрибуты приватны, то и название метода было бы полезно указывать как приватное.
Так мы там используем декоратор @private, чтобы сделать его приватным. Убираю подчерктвание, чтобы продемнстрировать, что он действительно приватным становится.
Можнали изменить специальное имя этих двух подчеркиваний?
10:40 не проще было сделать статик методом вместо класс метода?
Почему в разных источниках про protected дают разную инфу? В одних говорят что зона действия Класс и его Наследники. А в других - Модуль и даже Пакет. Что же правильно в итоге???
Модуль и пакеты - тоже верно )
Если "__init__()" и get_coord() выполняет то же самое, можно ли тогда в "__init__" вызвать get_coord()?
set_coord() вы имели в виду? Да, это нормальная практика.
👍
Что то не пойму, кто знает помогите, или кто понял. В методе def __init__(self, x=0, y=0) - начальные значения же здесь указаны? Зачем ниже строчка - self.__x = self.__y = 0?
создаются локальные приватные атрибуты __x и __y, иначе бы они не создались бы
@@selfedu_rus Создаются они строкой self.x = x? А тут наверно задаются значения локальным свойствам класса, которые применяются когда введено не верное значение в экземпляре класса, при вызове метода класса? Если более детально в строке init - значение по умолчанию(x = 0, y = 0), в экземпляре класса в строке pt = Point(1, 2) - присваиваются новые значения и если они не пройдут проверку(__check_value), то тогда работает строка self.__x = self.__y = значение которое будет присвоено, хоть строка.
@@Receive_ да, если x и y не проходят check value, то им присваивается 0
@protected работает также как @private,или есть отличия?
конечно, есть, @protected - можно внутри класса и во всех дочерних, @private - только внутри текущего класса
@@selfedu_rus Спасибо!
может я не понял, но когда мы пишем print(pt.__x), то выходит ошибка (как и должно быть). Но в то же время мы можем написать pt.__x = 500 и программа отработает. ну и если смотреть переменные в консоле, то там вообще всё запутывается ещё больше. спасибо.
при pt.__x = 500 создается локальный атрибут __x и он не имеет никакого отношения к приватной переменной __x
@@selfedu_rus спасибо за быстрый ответ и за курс :)
Читаю комментарии после просмотра видео несколько раз, и понимаю что походу тут самый непонятливый это я:( Что означает эта защита. Защита от кого или от чего?))
Защита от доступа "извне" (для программиста, который это будет использовать); защита от наследования и т.д. Только "защита" несколько условная, скорее, указание программисту, что этот метод или переменную трогать не надо, она для внутренней кухни класса ))
Ну... Если хорошенько подумать то в python вообще нету инкапсуляции.
нда. ооп в питоне так же как и типизация весьма корявенькая
почему нельзя отдать тебе все лайки которые я когда либо ставил, а, они и так все у тебя
accessify - эксэссифай, а не эксифай.
👍👍👏👏🫡
Все-таки "эксесифай", а не "эксифай")
Здравствуйте! Спасибо Вам за работу!
Хотел попросить записать курс, если есть такая возможность, по методам разработки больших приложений
Подскажите, пожалуйста, можно ли в пользовательском классе, подобно встроенным классам, сделать полную защиту от внешнего вмешательства (относительно всего - добавления, изменения или удаления свойств экземпляров класса и свойств и методов самого класса)?
на уровне языка Python можно защититься, используя магические методы delitem, delattr и другие подобные (о них рассказ впереди)
@@selfedu_rus Но тогда не очень понятно, если защиту можно сконструировать при помощи магических методов, зачем нужны эти режимы доступа? Например, тот же запрет на прямое (не через сеттер) изменение какого-либо свойства экземпляра класса можно прописать в методе __setattr__ , не обращаясь к private. И, по-моему, так даже надежнее (может, я чего-то не знаю). Объясните, пожалуйста.
можете сказать зачем здесь @classmethod если можно было просто написать без него (ваще не разобрался зачем нужен classmethod, только если брать переменные класса и все, сколько я б не перечитывал инфы зачем он нужен, я все равно так и не понял)
в classmethod первым параметром передается класс, а не его экземпляр, благодаря этому непосредственно в классе можно создавать и изменять атрибуты
@@selfedu_rusспс дружище
@selfedu_rus Почему вы в каких-то случаях говорите Свойства, в каких-то Данные, а в каких-то Атрибуты?
свойства объекта класса и локальные атрибуты объекта для меня это синонимы
Спасибо!
👍👍
👍
Спасибо!
Спасибо!