Спасибо большое. Вы первый автор такого видео, который умеет ответить на вопрос ровно в тот момент видео, когда я его мысленно задаю при прослушивании. Хорошее понимание материала, глубина и опыт впечатляют.
Пример идеального объяснения материала! Гений преподавания! Спасибо огромное за этот труд, "разжевали", осталось только "в рот положить...". Побольше таких материалов и можно не переживать за обучение будущих поколений. Буду рекомендовать ваш видео курс, еще раз спасибо за титанический труд!
Лучшего учителя по Python я больше не встречал, хотя долго искал, понял что книги важней чем видео, но здесь что то изумительно дословно и понятно объясняется.
Спасибо за Ваши уроки! Всё очень подробно и доходчиво. В этом уроке с ходу не понял, почему сработал финализатор. Нагуглил следующее: Счётчик ссылок для объекта становится нулевым, когда работа программы завершается. Может, пригодится кому-то.
Спасибо огромное! Когда-то именно из-за ООП забросил изучать программирование и собственно свой первый ЯП, тогда уж не мог нормально понять значение self, читал книгу по питону, на гитхабе читал разъяснения, но вот как пару месяцев назад снова влился в это всё, то ваш канал поставил мне определенную планку, из-за которой я каждый день или через день импруфаюсь
Занимаюсь разработкой уже года 3, но ООП для меня всегда был какой то противной темой))) Вы первый человек, который смог доходчиво донести материал, спасибо огромное!
Урок #3 = Пройден Хоть и с __init__ у меня уже была практика, новое для себя узнал, что можно явно указывать значения по умолчанию. Так же узнал, что __del__ относится к сборщику мусора Перехожу к след уроку :)
К примеру написана утилита, которая в режиме реального времени выдает количество коннектов к БД экземплярами определенного класса. Сам класс подсчитывает их средствами счетчика - интового атрибута уровня класса. То есть когда инстанс класса создается: атриубут уровня класса инкрементируется на 1. Тут как раз нужен del, так как при дропе экзмепляра будет вызван данный дандер метод, где нужно будет декрементировать атриубут уровня класса на 1. Разуеется можно юзать не простой счечик, а более сложную структуру по типу словаря, куда заносить доп данные: какой адрес БД, под каким юзером и т.д.
БД - база данных Инкрементирование - операция увеличения переменной (оператор инкрементирования += ) Дандер, он же магический метод, он же метод с двумя нижними подчеркиваниями - Dunder Это по терминам, а по абстракции тоже не понял 😂 это уровень к которому нужно стремиться наверное на данном этапе )
@@РусланУразбахтин-д2в спасибо за такую структуру - inc/dec, хотя пришлось несколько раз перематывать в начало, замедлять воспроизведение, но кажись понял. ))
Если у кого-то по каким-то причинам удаление объекта не проходит и нет надписи об удалении объекта: в конце кода вызовите >>> del имя_объекта (del object_X) ПРИМЕР для маленьких: del pt И class Point выдаст фразу об удалении объекта из метода # Удаление экземпляра def __del__(self): print('Удаление экземпляра:' + str(self))
Спасибо за уроки такого уровня, большая часть такого контента доступна только на английском, этот канал стоит особняком в русскоязычном ютубе, столь грамотной подачи не найти даже на английском, правда это является и минусом - нельзя поддержать автора либо приобрести его курс на степике, к сожалению. Ещё раз спасибо)
Может уместно будет добавить, что не стоит использовать __del__ как основной источник действий, логики или очистки памяти в процессе удаления объекта, так как он может и не сработать, если на объект будут вести какие-то неучтенные ссылки или в случае краша программы.
Привет Сергей. Учусь по твоим видеоурокам, мне нравятся твои уроки, ты молодец, респект! ) Но, всё же я где то, что то не догоняю, а именно: Вот я создал 2 простые конструкции, одну магическую, другую нет class Hello_1: a,b,c = 10,20,30 def __init__( self ): print( f'Hi: { self.a }, { self.b }, { self.c }' ) print( a,b,c ) Hello_1() def Hello_2(): a,b,c = 1000,2000,3000 def iinit(): print( f'Hi-Hi: { a }, { b }, { c }' ) iinit() print( a,b,c ) Hello_2() Они обе выполняют одно и то же, делают это одинаково, выдают один и тот же результат, но я ни как не могу понять если они делают одно и тоже, а вторая проще, зачем нужна первая?? )) Я провел эксперименты, городил в обеих кучи заборов, но и та и другая дают одно и тоже! )) Что я не понял из твоих уроков? )) Спасибо заранее за твой ответ. )
6:22 В чем все таки различие между фактическими и формальными параметрами. Из вашего базового курса (урок #38): "Можно задавать параметры со значениями по умолчанию . Такие параметры называются формальными, а обычные - фактическими. В чем отличие формальных параметров от фактических, помимо значений по умолчанию? Их не обязательно прописывать при вызове функции." В интернете (разные источники): "Формальные параметры - это переменные или значения, которые объявляются в определении функции, метода или другого объекта. Они определяют, какие аргументы могут быть переданы в функцию или метод. Фактические параметры - это значения, которые передаются в функцию или метод при вызове. " Получается (исходя из интернета), что все параметры объявленные в определении функции - формальные. Они могут быть и со значением по умолчанию и без. И короче помогите я запутался
@@light8032 с чем-то не согласен? - аргументированно обоснуй. Иначе подобный комментарий выглядит как банальный пердеж в муку. Но ты, чёрт возьми, прав, это я лох, в очередной раз повелся на вольную интерпретацию Серёги. Он в своей лекции подменил понятия позиционных и именованных аргументов, на фактические и формальные. Что-то слишком часто у него стало проскальзывать "свое видение" некоторых понятий. В теме по регэкспу тоже лютую дичь городил. Надо быть осторожнее и коммент на всякий случай снес, чтобы не вводил людей в заблуждение, ибо там была копипаста Серёгиной лапши.
Ахах минут 15 сидел не понимал почему не работает и уже лез в инет оказывается вместо __init__ написал __int__ будьте внимательно друзья если некоторые вещи пишет IDE
Пожалуй, это самый важный урок по ооп. Спасибо автору. Хотелось бы простенького примера графического приложения с виджетами. Непонятно, почему к виджету нужна приставка self?
Сергей, почему когда мы пишем метод def __del__(self): print('чего-то там, мол удалено') мы его не переопределяем? Ведь он, по идее, теперь должен только писать, что удалил что-то, но не удалять в действительности. А если он не переопределяется, то почему такое не работает с __new__?
метод del() действительно не удаляет объект, он вызывается, когда сборщик мусора собирается его удалить (то есть, непосредственно перед удалением объекта), но когда это произойдет - неизвестно. Метод new() также можно переопределять без проблем и вызывается он непосредственно перед созданием самого объекта. Причем, для создания нужно вызвать аналогичный метод из базового класса object.
При реализации в классе магического метода __del__ и инициализации объекта класса нулем, данный метод не вызывается, однако он вызывается при явном удалении объекта с помощью del.
Добрый день! Вопрос по удалению. Я создал обьект PT. Далее отработало удаление. Но по факту если я обращусь из юпитера к этому обьекту - то он никуда не девался. Не до конца понятно, он удаляет из памяти, но где же тогда сохраняется обьект?
Одного меня терзают мысли как получилось что функция get__coords увилела методы self.x и self.y которые находятся внутри другой функции? Мы же такого не проходили в областе видимости
селф - это ссылка на тот экземпляр, с котором работает в текущий момент метод класса. после точки соответственно идут ссылки на атрибуты экземпляра. сначала мы функцией сет-коордс задаём этим атрибутам значение, потом через гет считываем их. то есть гет не видит переменных в другой функции. она по факту берет результат ее выполнения, который ранее был записан в экземпляре (вроде так, сорри если криво объяснил, я сам только пару часов как изучаю это)
Спасибо за видео. У меня странный вопрос: Как я могу практиковать ООП, если в Джанго грубо говоря я использую всё готовое ? Плюс, где вообще место паттернам в веб- программировании?)
В последнем примере был удалён объект класса Point, но ссылка pt на него была прописана в файле, и перед самим удалением были даже выведены значения объекта. Почему так? После отработки программы удаляются все объекты, которые она инициализировала? ТО-есть, получается, что в момент запуска программы, она создаёт объекты в памяти, которые мы прописали в файле, проделывает заданную программу, а потом всё стирает, чтобы освободить память?
Не до конца понял вопроса. У нас есть объект pt класса Point, внутри класса определен финализатор del. Когда сборщик мусора освобождает память, занимаемую объектом, вызывается финализатор. До тех пор объект существует в памяти. Ну и когда программа завершается, то конечно, все выделенные ресурсы освобождаются.
@@selfedu_rus Аа, понятно, а подскажите ещё, пожалуйста. Я изучаю django и в нём есть предустановленные модели. Так вот, когда мы создаём собственную модель для базы данных, где хранятся ссылки на экземпляры этих классов или они сами? И в какой момент они создаются? В момент добавления записей на сайте? Просто, ранее, в Python, мы привязывали экземпляр к переменной, и там было всё понятно, а здесь никаких явных привязок не видно.
@@ResellerRus чтобы это понять вам лучше посмотреть занятие по метаклассам (я там этот вопрос затрагиваю), ну а ссылки внутри самого фреймворка, он всем там управляет ))
странно, но почему-то в пайчарме __del__ работает отлично, удаляет действительно после того, как объект стал не нужен и именно тот объект с той же ссылкой, что и был создан. а если записать тот же пример в юпитер ноутбуке, то там всегда удаляет сразу после вызова __init__ какой-то левый объект c другим адресом.
Пробовал разобраться, если актуально, то вот к чему пришёл сам: jupyter сохраняет объект до следующего запуска текущей ячейки, либо иной ячейки, где будет создан новый объект pt. Т.е. jupyter считает, что объект pt ещё тебе может пригодиться. И в памяти будет существовать старый объект pt до момента его пересоздания в текущей или последующих ячейках. Также протестил: с закрытием .ipynb все объекты удаляются.
Добрый день! Прекрасные уроки. Подскажите пожалуйста, на протяжении лекции было 2 не задействованные функции из пред. урока (set и get coords). Без них всё работает. Вы их просто не убрали или они для чего то здесь нужны?
Я вначале показываю, как можно через эти методы формировать и записывать данные в локальные атрибуты объекта класса. Потом показываю, что это лучше делать через инициализатор. Ну а методы, да, остались, ими можно пользоваться, если нужно изменить соответствующие значения.
окей, но все равно не понятно почему применился метод дел. Ведь мы не переопределяли переменные. У нас есть экземпляр pt у него единственное значение - класс. Далее мы ничего не присваивали переменной pt
Я только пробую, просьба камнями не кидать. А в чем разница внутри класса между обычным "переменная = значение" и "def __init__: self.переменная = значение"? Пробовал- и так и так- всё "принтится" и изменяется как при обращении к классу так и к экземпляру класса.
у меня вопрос когда создается объект класса, например test = Class() то как вывести такой принт - "Создается объект test то есть вывести имя переменной которая и будет объектом класса
@@selfedu_rus если написать в ините такое то будет выдан адрес. если переопределить метод __str__ то будет ошибка, как я понял какая то зацикленность получится. пробовал в юпитере - не получилось короче.
у меня вопрос почему сразу когда хочешь установить данные которые тебе надо почему сразу это не писать в методе типо так: class Point: color = 'red' circle = 2 def __init__(self): self.x = 8 self.y = 4
Объектов класса обычно больше 1, с таким подходом у всех будут одинаковые данные со старта. Если захочется другие координаты(пример), придется переопределять их каким то методом. Если у вас 1000 точек, то для каждой прописывать то, что можно сделать при создании объекта как минимум утомительно. Надеюсь стало понятнее
Спасибо большое. Если __del__ вызывается автоматически в случае отсутствия ссылок на объект без фактического написания данного метода в классе, то возникает вопрос, есть ли случаи когда следует прописывать эту функцию (метод) в классе?
Не понял... Что значит вызывается без фактического написания метода в классе ? Если метода в классе нет, то он и не вызывается... Метод __del__ не удаляет объект, он выполняет финальные операции перед удалением (если таковые требуются). Удаляет сборщик мусора. Ну если я сам всё правильно понял )
например, чтобы точно проверить, что соединение закрыто, с бд, сокетом и т.п. или например, что некий лок тоже был снят. В абстракции - гость уходит - проверить не забыл ли он шляпу или зонт.
между методами и функциями есть одно важное отличие: методы, как правило, связаны с тем или иным объектом класса и потом им первым параметром передается self; у обычных функций такого нет
Становиться понятно, когда нет Х, У и прочего. Нужно показывать суть в действии на примере окон, кнопок, действий. А так это просто баловство цифрами и буквами. Алгоритм для людей: Код = наглядный пример (приложение, окно с кнопкой, цвет, звук)
Спасибо большое. Вы первый автор такого видео, который умеет ответить на вопрос ровно в тот момент видео, когда я его мысленно задаю при прослушивании. Хорошее понимание материала, глубина и опыт впечатляют.
Только благодаря этому видео мне стало понятно почему self.x = x))) Да и все остальные вопросы сразу прояснились. Спасибо большое!😀
Пример идеального объяснения материала! Гений преподавания! Спасибо огромное за этот труд, "разжевали", осталось только "в рот положить...". Побольше таких материалов и можно не переживать за обучение будущих поколений. Буду рекомендовать ваш видео курс, еще раз спасибо за титанический труд!
Вы в рот себе и ложите нам не надо😂
Лучшего учителя по Python я больше не встречал, хотя долго искал, понял что книги важней чем видео, но здесь что то изумительно дословно и понятно объясняется.
Сначала ставлю лайк, потом смотрю видео, как жаль, что я не нашёл ваш канал раньше!
Спасибо за Ваши уроки! Всё очень подробно и доходчиво. В этом уроке с ходу не понял, почему сработал финализатор. Нагуглил следующее:
Счётчик ссылок для объекта становится нулевым, когда работа программы завершается.
Может, пригодится кому-то.
Спасибо за такой маленький и такой длинный урок! Луч света в темном царстве основ ООП. )))
Спасибо большое! Есть лишь одно пожелание
добавляйте домашнее задание, как Вы это делали в прошлом варианте курса по ООП
Просто те шо я шукав вся інформація шо мені нада ти самий лучиш!
Спасибо огромное! Когда-то именно из-за ООП забросил изучать программирование и собственно свой первый ЯП, тогда уж не мог нормально понять значение self, читал книгу по питону, на гитхабе читал разъяснения, но вот как пару месяцев назад снова влился в это всё, то ваш канал поставил мне определенную планку, из-за которой я каждый день или через день импруфаюсь
Точно! self это что то, тоже была трудность в понимании, до этого и книжки читал и видосы других блогеров смотрел, но понял только здесь.
Ни одного лишнего слова. Все структурированно и по делу. Талант !
Спасибо, что не упускаете детали и акцентируете на них внимание. Достойный курс
Занимаюсь разработкой уже года 3, но ООП для меня всегда был какой то противной темой))) Вы первый человек, который смог доходчиво донести материал, спасибо огромное!
самые внятные и толковые объяснения из всех, что я видел
Ура, я начинаю понимать ООП на питоне! Спасибо, Сергей!
Разобрался только благодаря Вам, теперь в коде все ясно.
Спасибо, посмотрела! интересно рассказываете
Вы просто гений
У меня слов нету!
Урок #3 = Пройден
Хоть и с __init__ у меня уже была практика, новое для себя узнал, что можно явно указывать значения по умолчанию.
Так же узнал, что __del__ относится к сборщику мусора
Перехожу к след уроку :)
твои видосы и объяснения просто шедевр
Все очень понятно и просто. Спасибо вам огромное!
Думал ни когда в жизни не дастся мне ООП. Вроде нормально пока. Понятно все. Едим дальше.)))
Хотелось бы увидеть примеры использования __del__, трудно представить зачем он может пригодится, вне чисто учебного материала.
К примеру написана утилита, которая в режиме реального времени выдает количество коннектов к БД экземплярами определенного класса. Сам класс подсчитывает их средствами счетчика - интового атрибута уровня класса.
То есть когда инстанс класса создается: атриубут уровня класса инкрементируется на 1. Тут как раз нужен del, так как при дропе экзмепляра будет вызван данный дандер метод, где нужно будет декрементировать атриубут уровня класса на 1.
Разуеется можно юзать не простой счечик, а более сложную структуру по типу словаря, куда заносить доп данные: какой адрес БД, под каким юзером и т.д.
@@РусланУразбахтин-д2в что?
БД - база данных
Инкрементирование - операция увеличения переменной (оператор инкрементирования += )
Дандер, он же магический метод, он же метод с двумя нижними подчеркиваниями - Dunder
Это по терминам, а по абстракции тоже не понял 😂 это уровень к которому нужно стремиться наверное на данном этапе )
@@РусланУразбахтин-д2в спасибо за такую структуру - inc/dec, хотя пришлось несколько раз перематывать в начало, замедлять воспроизведение, но кажись понял. ))
@@РусланУразбахтин-д2в этот дендерный метод __del__ нужно прописывать явно в классе?
У вас самые понятные объяснения по этой теме , спасибо
Если у кого-то по каким-то причинам удаление объекта не проходит и нет надписи об удалении объекта:
в конце кода вызовите
>>> del имя_объекта (del object_X)
ПРИМЕР для маленьких:
del pt
И class Point выдаст фразу об удалении объекта из метода
# Удаление экземпляра
def __del__(self):
print('Удаление экземпляра:' + str(self))
Спасибо тебе! Так смачно всё разъяснить смог только ты почему-то
Сергей, спасибо за урок!
Спасибо за уроки такого уровня, большая часть такого контента доступна только на английском, этот канал стоит особняком в русскоязычном ютубе, столь грамотной подачи не найти даже на английском, правда это является и минусом - нельзя поддержать автора либо приобрести его курс на степике, к сожалению. Ещё раз спасибо)
спасибо за ваш труд) одно удовольствие слушать
Великолепно) Спасибо большое!💛🙏
прекрасные уроки! если бы вы делали еще домашние задания к каждому уроку с ответами, я бы с удовольствием купила бы этот сборник !
Спасибо! Практические задания по ссылке на курс на Stepik!
Благодарю за видео!
Было бы здорово добавить задания для самоподготовки🙃
Может уместно будет добавить, что не стоит использовать __del__ как основной источник действий, логики или очистки памяти в процессе удаления объекта, так как он может и не сработать, если на объект будут вести какие-то неучтенные ссылки или в случае краша программы.
Спасибо большое за курс! Вам хорошо удаётся объяснение) 😁
Можно странный вопрос?
На каком языке вы ещё говорите?
Привет Сергей.
Учусь по твоим видеоурокам, мне нравятся твои уроки, ты молодец, респект! )
Но, всё же я где то, что то не догоняю, а именно:
Вот я создал 2 простые конструкции, одну магическую, другую нет
class Hello_1:
a,b,c = 10,20,30
def __init__( self ):
print( f'Hi: { self.a }, { self.b }, { self.c }' )
print( a,b,c )
Hello_1()
def Hello_2():
a,b,c = 1000,2000,3000
def iinit():
print( f'Hi-Hi: { a }, { b }, { c }' )
iinit()
print( a,b,c )
Hello_2()
Они обе выполняют одно и то же, делают это одинаково, выдают один и тот же результат, но я ни как не могу понять если они делают одно и тоже, а вторая проще, зачем нужна первая?? ))
Я провел эксперименты, городил в обеих кучи заборов, но и та и другая дают одно и тоже! ))
Что я не понял из твоих уроков? ))
Спасибо заранее за твой ответ. )
Посмотрите еще раз первый урок
Можно еще явно указать имя аргумента, которому передается параметр: pt = Point(y=1)
добрый день,спасибо за доступное изложение,но,хотелось бы,как в курсе по Python,получить домашку)))
Еще раз Вам спасибо за курс)
6:22 В чем все таки различие между фактическими и формальными параметрами.
Из вашего базового курса (урок #38):
"Можно задавать параметры со значениями по умолчанию . Такие параметры называются формальными, а обычные - фактическими. В чем отличие формальных параметров от фактических, помимо значений по умолчанию? Их не обязательно прописывать при вызове функции."
В интернете (разные источники):
"Формальные параметры - это переменные или значения, которые объявляются в определении функции, метода или другого объекта. Они определяют, какие аргументы могут быть переданы в функцию или метод. Фактические параметры - это значения, которые передаются в функцию или метод при вызове. "
Получается (исходя из интернета), что все параметры объявленные в определении функции - формальные. Они могут быть и со значением по умолчанию и без. И короче помогите я запутался
@@SayXaNowиди учись и потом пиши
@@light8032 с чем-то не согласен? - аргументированно обоснуй. Иначе подобный комментарий выглядит как банальный пердеж в муку. Но ты, чёрт возьми, прав, это я лох, в очередной раз повелся на вольную интерпретацию Серёги. Он в своей лекции подменил понятия позиционных и именованных аргументов, на фактические и формальные. Что-то слишком часто у него стало проскальзывать "свое видение" некоторых понятий. В теме по регэкспу тоже лютую дичь городил. Надо быть осторожнее и коммент на всякий случай снес, чтобы не вводил людей в заблуждение, ибо там была копипаста Серёгиной лапши.
Ахах минут 15 сидел не понимал почему не работает и уже лез в инет оказывается вместо __init__ написал __int__ будьте внимательно друзья если некоторые вещи пишет IDE
Спасибо, я тоже ))))))))))
Что такое IdE?
@@Unlimit-729 Попробуй закинуть этот вопрос в гугл
Пожалуй, это самый важный урок по ооп. Спасибо автору. Хотелось бы простенького примера графического приложения с виджетами. Непонятно, почему к виджету нужна приставка self?
спасибо за ролик!
Опаньки) а я ждал ;)
Спасибо вам большое 🤝
Вот и чудненько!
Огромное спасибо!
А почему в вашем случае произошло удаление объекта? Вы ведь не переопределяли переменную pt, которая ссылается на него?
программа завершилась и там уже все объекты автоматом удаляются
То, что Вы делаете - очень ценно!
а зачем оставили set_coords, если ___init___ делает то же самое?
Сергей, почему когда мы пишем метод
def __del__(self):
print('чего-то там, мол удалено')
мы его не переопределяем? Ведь он, по идее, теперь должен только писать, что удалил что-то, но не удалять в действительности.
А если он не переопределяется, то почему такое не работает с __new__?
метод del() действительно не удаляет объект, он вызывается, когда сборщик мусора собирается его удалить (то есть, непосредственно перед удалением объекта), но когда это произойдет - неизвестно. Метод new() также можно переопределять без проблем и вызывается он непосредственно перед созданием самого объекта. Причем, для создания нужно вызвать аналогичный метод из базового класса object.
Спасибо, все четко. Только вот из ранее изучаемого это были не "магические методы", а конструктор и деструктор и служебные функции :)
там неверно, это инициализатор и финализатор ))
Отлично Отлично!
Вы в Москве преподаете?
При реализации в классе магического метода __del__ и инициализации объекта класса нулем, данный метод не вызывается, однако он вызывается при явном удалении объекта с помощью del.
Она вызовется когда сборщик мусора его станет удалять.
Как я понимаю курс на степике жители других стран не могут приобрести?
Доброго дня всем! Подскажите, пожалуйста, __del__ получается очищает память?
нет, очищает сборщик мусора и когда это произойдет никто не знает ))
Добрый день! Вопрос по удалению. Я создал обьект PT. Далее отработало удаление. Но по факту если я обращусь из юпитера к этому обьекту - то он никуда не девался. Не до конца понятно, он удаляет из памяти, но где же тогда сохраняется обьект?
потому что он забыл прописать del.PT мы создали метод но не использовали его
PT = Point()
del.PT
просто забыл, видимо
Спасибо за уроки 🖖👍
7:46 то есть он финализировался, когда закончилось выполнение кода?
у меня да, но когда именно сборщик мусора его финализирует никто точно не скажет
А можно ли в методе __del__ сослаться на тот же класс в котором он создан,тем самым создать новый объект класса?
Одного меня терзают мысли как получилось что функция get__coords увилела методы self.x и self.y которые находятся внутри другой функции? Мы же такого не проходили в областе видимости
селф - это ссылка на тот экземпляр, с котором работает в текущий момент метод класса. после точки соответственно идут ссылки на атрибуты экземпляра. сначала мы функцией сет-коордс задаём этим атрибутам значение, потом через гет считываем их. то есть гет не видит переменных в другой функции. она по факту берет результат ее выполнения, который ранее был записан в экземпляре (вроде так, сорри если криво объяснил, я сам только пару часов как изучаю это)
Нужно ли деструктор __del__ объявлять в классе явно? Или стоит только переопределять его при необходимости добавить новый функционал?
нет, не нужно и почти никогда не определяют
@@selfedu_rus благодарю!
Спасибо за видео. У меня странный вопрос: Как я могу практиковать ООП, если в Джанго грубо говоря я использую всё готовое ? Плюс, где вообще место паттернам в веб- программировании?)
В больших приложениях, там где уже готовые паттерны типа Django не подходят или приходится писать свои модули для особенных фич.
В последнем примере был удалён объект класса Point, но ссылка pt на него была прописана в файле, и перед самим удалением были даже выведены значения объекта. Почему так? После отработки программы удаляются все объекты, которые она инициализировала?
ТО-есть, получается, что в момент запуска программы, она создаёт объекты в памяти, которые мы прописали в файле, проделывает заданную программу, а потом всё стирает, чтобы освободить память?
Не до конца понял вопроса. У нас есть объект pt класса Point, внутри класса определен финализатор del. Когда сборщик мусора освобождает память, занимаемую объектом, вызывается финализатор. До тех пор объект существует в памяти. Ну и когда программа завершается, то конечно, все выделенные ресурсы освобождаются.
@@selfedu_rus Аа, понятно, а подскажите ещё, пожалуйста. Я изучаю django и в нём есть предустановленные модели. Так вот, когда мы создаём собственную модель для базы данных, где хранятся ссылки на экземпляры этих классов или они сами? И в какой момент они создаются? В момент добавления записей на сайте?
Просто, ранее, в Python, мы привязывали экземпляр к переменной, и там было всё понятно, а здесь никаких явных привязок не видно.
@@ResellerRus чтобы это понять вам лучше посмотреть занятие по метаклассам (я там этот вопрос затрагиваю), ну а ссылки внутри самого фреймворка, он всем там управляет ))
спасибо!👏
Спасибо огромное
странно, но почему-то в пайчарме __del__ работает отлично, удаляет действительно после того, как объект стал не нужен и именно тот объект с той же ссылкой, что и был создан.
а если записать тот же пример в юпитер ноутбуке, то там всегда удаляет сразу после вызова __init__ какой-то левый объект c другим адресом.
там, немного другая среда и логика функционирования, вполне может быть
Пробовал разобраться, если актуально, то вот к чему пришёл сам:
jupyter сохраняет объект до следующего запуска текущей ячейки, либо иной ячейки, где будет создан новый объект pt. Т.е. jupyter считает, что объект pt ещё тебе может пригодиться. И в памяти будет существовать старый объект pt до момента его пересоздания в текущей или последующих ячейках.
Также протестил: с закрытием .ipynb все объекты удаляются.
Добрый день! Прекрасные уроки.
Подскажите пожалуйста, на протяжении лекции было 2 не задействованные функции из пред. урока (set и get coords). Без них всё работает. Вы их просто не убрали или они для чего то здесь нужны?
Я вначале показываю, как можно через эти методы формировать и записывать данные в локальные атрибуты объекта класса. Потом показываю, что это лучше делать через инициализатор. Ну а методы, да, остались, ими можно пользоваться, если нужно изменить соответствующие значения.
@@selfedu_rus Благодарю за разъяснение!
Зачем нужно прописывать __del__, если коллектор все подчистит ?
норм
+
согл
С __del__ если честно не все понятно,потому что если pt присвоить другое значение то предидущий и так удалится
Сергей , Здравствуйте, будет ли ролик про метапрограммирование?
Будет про метаклассы
Подскажите у вас есть видео про правило Видроу Хоффа?
нет, не делал
раз объект удален, тогда почему к нему все еще можно обращаться?
задайтесь вопросом: что значит объект удален?
окей, но все равно не понятно почему применился метод дел. Ведь мы не переопределяли переменные. У нас есть экземпляр pt у него единственное значение - класс. Далее мы ничего не присваивали переменной pt
программа завершилась. а перед завершением естественно все удаляется из памяти
@@SayXaNow спасибт
Спасибо
😮😮😮😮
Не понял, а ЧТО именно удалится когда мы пишем __del__(self) ? Объекты, на которые ссылались X и Y ?
этот метод вызывается перед освобождением памяти, который занимает объект класса
подскажите пожалуйста, сколько человек прошли полностью ваш курс?
какой?
@@selfedu_rus добрый, добрый пайтон
@@andreychernykh256 я думаю, человек 200-300
Зачем так написать ?? Когда можно просто написать в конструкторе??
Зачем переменные pt??
Я только пробую, просьба камнями не кидать. А в чем разница внутри класса между обычным "переменная = значение" и "def __init__: self.переменная = значение"? Пробовал- и так и так- всё "принтится" и изменяется как при обращении к классу так и к экземпляру класса.
ответ в этом уроке th-cam.com/video/P4CNNo8jWj4/w-d-xo.html
@@selfedu_rus благодарю за оперативность, думал что за веткой уже не следят) посмотрю
у меня вопрос
когда создается объект класса, например test = Class() то как вывести такой принт - "Создается объект test
то есть вывести имя переменной которая и будет объектом класса
В init или new прописываете и все, обычно в init такое пишут
@@selfedu_rus если написать в ините такое то будет выдан адрес. если переопределить метод __str__ то будет ошибка, как я понял какая то зацикленность получится. пробовал в юпитере - не получилось короче.
На stepik баг, я не могу отзыв на курс оставить
странно, другие вроде писали...
Вы его прошли ? Там надо 80 % пройти, чтобы можно было отзыв оставлять...
там можно поставить отзыв только на странице отзывов. У меня тоже такое было.
у меня вопрос почему сразу когда хочешь установить данные которые тебе надо почему сразу это не писать в методе типо так:
class Point:
color = 'red'
circle = 2
def __init__(self):
self.x = 8
self.y = 4
Объектов класса обычно больше 1, с таким подходом у всех будут одинаковые данные со старта. Если захочется другие координаты(пример), придется переопределять их каким то методом. Если у вас 1000 точек, то для каждой прописывать то, что можно сделать при создании объекта как минимум утомительно. Надеюсь стало понятнее
И снова топ оф зе топ)
Спасибо большое. Если __del__ вызывается автоматически в случае отсутствия ссылок на объект без фактического написания данного метода в классе, то возникает вопрос, есть ли случаи когда следует прописывать эту функцию (метод) в классе?
В практике не встречалось, т.е. это очень редко используется, фактически, заложена такая возможность, надо - делаем, не надо - не делаем :)
Не понял... Что значит вызывается без фактического написания метода в классе ? Если метода в классе нет, то он и не вызывается... Метод __del__ не удаляет объект, он выполняет финальные операции перед удалением (если таковые требуются). Удаляет сборщик мусора. Ну если я сам всё правильно понял )
@@mantrida Совершенно верно!
например, чтобы точно проверить, что соединение закрыто, с бд, сокетом и т.п. или например, что некий лок тоже был снят.
В абстракции - гость уходит - проверить не забыл ли он шляпу или зонт.
@@mantrida спасибо за пояснение, а то из ролика это с трудом улавливается. Не расставлены акценты.
👍
👍👍👍👍
0:45 методы? может функции лучше называть? слушатель может запутаться
между методами и функциями есть одно важное отличие: методы, как правило, связаны с тем или иным объектом класса и потом им первым параметром передается self; у обычных функций такого нет
Я не понял через dict можно вызвать как словарь, или через geter типо там return ,а просто pt написать ,просто компа нету
Я этот момент не догнал!
Получается метод __init__ это конструктор а __del__ деструктор?
нет, инициализатор и финализатор, за конструктор отвечает метод __new__
Конструктор и деструктор? 🤔
инициализатор и финализатор
@@selfedu_rus в другом виде у вас сказано - конструктор и деструктор😁
@@dadyx85 там неправильно - там старый курс, позже удалю, наверное
@@selfedu_rus нее. Не удаляйте, пожалуйста. Я и тот смотрю и этот. 👍
я люблю тебя
Инициализатор это то же самое, что и конструктор в c#
в Python это не так, конструктор - это метод __new__
у меня __del__ не срабатывает
это возможно, очистка происходит в непредсказуемые моменты времени )
Становиться понятно, когда нет Х, У и прочего.
Нужно показывать суть в действии на примере окон, кнопок, действий.
А так это просто баловство цифрами и буквами.
Алгоритм для людей:
Код = наглядный пример (приложение, окно с кнопкой, цвет, звук)
не совсем понятно зачем нужен этот метод
на 100К убавилось просмотров 🤣🤣🤣🤣🤣🤣🤣🤣
Я ведь правильно понял, что инициализатор и финализатор являются аналогами конструктора и деструктора в c++ / c# ?
нет, аналоги конструктора - это __new__, а деструктора как такового нет
@@selfedu_rus спасибо