#4. Магический метод __new__. Пример паттерна Singleton | Объектно-ориентированное программирование

  Рет қаралды 141,399

selfedu

selfedu

Күн бұрын

Пікірлер: 236
@web4453
@web4453 2 жыл бұрын
видно, что у человека порядок в голове и полное понимание темы. Потому информация, которую он доносит максимально легко усваивается. Спасибо
@Shishio58
@Shishio58 2 жыл бұрын
Кто ты????? Откуда ты??? Просто пусть у тебя будет так же гладко по жизни как ты даешь материал! Лучший!!!!!!!!!!!
@ПлатонТрипуть
@ПлатонТрипуть Жыл бұрын
В этом ролкике поначалу было трудно , но после тщательного просмотра несколько раз, до меня ,наконец все дошло , по-моему , один из лучших курсов в СНГ по ООП
@mslq
@mslq Жыл бұрын
Однозначно! Это лучшие видосы по пайтону, но всё равно я другие тоже засматриваюсь, для закрепления темы.
@АркадийПоддубный
@АркадийПоддубный 12 күн бұрын
Огромное спасибо Сергею за работу - он действительно один из немногих, кто умеет просто объяснять сложные темы. Но позволю себе пару замечаний в порядке конструктивной критики. Автор адски путается в терминах, что затрудняет понимание материала. В частности, чтобы не быть голословным. 1) понятия "экземпляр класса" (или "объект класса") и "класс" зачастую используются как синонимы, что является грубой ошибкой. Экземпляр (или объект класса) и сам класс - это не одно и то же. В частности, параметр cls в методе __new__ - это ссылка не на экземпляр класса (т. к. на данном этапе экземпляров класса еще нет), а на создаваемый класс. 2) точно так же не являются синонимами термины "атрибут" класса и "свойство", но автор нередко называет одно другим, что очень путает - особенно если ты начинающий. Не зря ведь наверное в англоязычных источниках есть два термина - attribute и property. Но в целом, повторюсь, данный канал - это порой единственное, что помогает разобраться в некоторых темах. Поэтому, надеюсь, критика не прозвучала голословно.
@ЭльвираСадыкова-э7г
@ЭльвираСадыкова-э7г 7 ай бұрын
Прочитала комментарии и хочется сказать - тут зрители аплодируют , апплодируют. Так понятно, что ни йуха не понятно.
@alEx-xs9kv
@alEx-xs9kv Ай бұрын
Потому что питон нужно изучать после плюсов и будет всё понятно)
@ЕрвандАгаджанян-в3к
@ЕрвандАгаджанян-в3к 2 жыл бұрын
Ты абсолютный гений!!! Какая-то невероятная подача материала!!! Спасибо!!!
@maxholon
@maxholon Жыл бұрын
Подача настолько хороша, что я уже прям чувствую, что скоро начну начинать понимать.
@katerikaL
@katerikaL 6 ай бұрын
ООП становится интересной темой. Огромнейшее спасибо, мне столько в институте не рассказывали сколько я от вас узнала❤‍🔥❤‍🔥
@КонстантинБарышев-ю9ю
@КонстантинБарышев-ю9ю 2 жыл бұрын
Очень качественная подача, браво!
@NoName-hi8bv
@NoName-hi8bv Жыл бұрын
Наконец то всё просто и лаконично без взякий дёрганей. Кратко и по факту. Что как создаётся. Почему столь простые вещи так усложняют.
@ArntorRUS
@ArntorRUS 2 ай бұрын
Спасибо за подробную и интересную подачу материала! Как раз смотрел искал реализацию такой возможности!
@sofiipochta
@sofiipochta Ай бұрын
Спасибо, посмотрела!
@ccjx_space
@ccjx_space Жыл бұрын
Вы объясняете детали, которые у человека маловероятно, что выйдет получить читая книги. Большое Вам спасибо!
@clqwnless
@clqwnless Жыл бұрын
Спасибо за очень хорошее объяснение! Мне понравилось очень сильно то, что вы добавили "__del__'!
@vladimirkulakov8667
@vladimirkulakov8667 2 жыл бұрын
Спасибо! Очень интересно и доходчиво! Чувствую как растет моя суперсила))))
@igor-policee
@igor-policee 2 жыл бұрын
Прекрасные уроки, спасибо!
@yyykkk4175
@yyykkk4175 2 жыл бұрын
Теперь в уроке следующая проблема (Python 3.8.6) ----> при удалении экземпляра класса прописанный служебный метод __del__ не отрабатывает. Те он не меняет атрибут класса. Такое ощущение, что есть какие-то ref'ы к атрибуту именно класса от экземпляра, что препятствует правильному срабатыванию __del__ . Когда атрибут класса является чем либо, но не присваиваемым классом, все отрабатывает на ура, но когда атрибут - сам же класс, то тут начинаются проблемы. Тема с синглтонами весьма неоднозначна и имеет очень много подводных камней. PS Лайк все-равно поставил)))
@non5309
@non5309 2 жыл бұрын
Спасибо автору за материалы. Адаптацию практики бы еще под этот новый материал - было бы супер. Да вообще я был бы не против заплатить на каком-нибудь степике за глубокий курс по ООП с хорошими задачами по практике
@UrTa91
@UrTa91 Жыл бұрын
Так они там вроде есть?
@nightyum
@nightyum Жыл бұрын
Отличный канал по урокам на питон, всё понятно, спасибо большое!
@igorb.4917
@igorb.4917 2 жыл бұрын
Отличный курс, спасибо!
@СарматПересветов
@СарматПересветов Жыл бұрын
очень крутой урок, огромное спасибо за ваш труд!
@nikitun85
@nikitun85 2 жыл бұрын
Друже, неистово плюсуюсь к восхищающимся твоей подачей. Очень доходчиво!
@rogersmith3141
@rogersmith3141 10 ай бұрын
Объяснение просто огонь!
@VladislavVoronin-fc1fo
@VladislavVoronin-fc1fo Жыл бұрын
Уроки - моё почтение. 10/10
@suslikest3708
@suslikest3708 Жыл бұрын
Топ! до этого видоса я не до конца понимал суть этого маг метода.
@gilman2056
@gilman2056 Жыл бұрын
ясно-спасибо, действительно подача материала хорошая все остальные ролик выше по запросу непонятно объясняют некоторые моменты
@andredru4278
@andredru4278 7 ай бұрын
Спасибо. Понятно. Вперед!
@aleksandrsemenov1764
@aleksandrsemenov1764 2 жыл бұрын
Очень полезный материал, я уже год учу пайтон и информация по реализации Singleton очень кстати. Спасибо!
@empty9228
@empty9228 2 жыл бұрын
Сергей, спасибо за урок! У вас отличная подача материала.
@vladislavshesternov8384
@vladislavshesternov8384 2 жыл бұрын
Конечно, огромный разрыв в понимании в сравнении с предыдущим курсом, хотя.. Может мне только так кажется, учитываю, что я его прошел и сейчас по сути занимаюсь повторением материала? Ну а так, огромное СПАСИБО автору, очень постарался, это прям видно =)
@matsveiv6712
@matsveiv6712 5 ай бұрын
Еще раз огромное спасибо! Было бы славно, если бы вы опубликовали код программы в описании для разбора и редактирования.
@milash8861
@milash8861 6 ай бұрын
Наконец-то поняла, спасибо!❤
@ВикторПелих-я6ш
@ВикторПелих-я6ш Жыл бұрын
Спасибо за ещё одну порцию информации. Дааа... это, конечно, не "ООП за 15 минут"
@KromlechKannabikus
@KromlechKannabikus 2 жыл бұрын
Мастерски подан материал. Благодарю
@Receive_
@Receive_ 2 жыл бұрын
У меня одного сейчас мозг взорвется? Как было все легко до знакомства с ООП
@skeam9988
@skeam9988 Жыл бұрын
Не одной, всё нормально
@UCgmf-pIUcccps9m1uGjOxaQ
@UCgmf-pIUcccps9m1uGjOxaQ Жыл бұрын
Дорогу осилит идущий!
@Developer_python_
@Developer_python_ Жыл бұрын
next django)
@alexandr8153
@alexandr8153 Жыл бұрын
Я с ооп уже год топчусь на месте. Не читайте М. Лутца, он сложно о простом пишет
@linked_list_DLL
@linked_list_DLL 2 ай бұрын
Крч, для чайников, если кто не понял. В старых версиях python, когда мы определяли класс, мы всегда наследовались от базового object. Т.е, писали мы следующее: class (object): .После релиза python 3 этот синтаксис упростился и стали писать без наследования. Иными словами, функция super() неявно ссылается на суперкласс object, в котором вызывается дандер __new__, а в аргумент этого дандера закидываем ссылку на наш созданный класс (класс Point).
@cs_dequeue
@cs_dequeue 2 жыл бұрын
Супер обяснение! Было очень понятно и полезно. Пошел искать видео про магический метод __call__)
@СашаКарташов-э8ъ
@СашаКарташов-э8ъ 6 ай бұрын
Нашел что то?
@cs_dequeue
@cs_dequeue 6 ай бұрын
@@СашаКарташов-э8ъ давно) магический метод __call__ делает инстансы(экземпляры) класса вызываемыми(callable), т е. если у нас есть класс MyClass у которого есть метод __call__, то m = MyClass, тут m экземпляр MyClass, и при m() - вызывается метод __call__. Так можно к примеру реализовать декораторы на основе классов. Это если вкратце. Пс: Возможно в этом видео это все уже сказано, комментарии мой старый, а видео не пересмотрел)
@nadyamoscow2461
@nadyamoscow2461 3 ай бұрын
Далеко ходили? Он же есть в этом же курсе
@McClean974
@McClean974 Ай бұрын
@@cs_dequeue уже устроились на работу?😂
@cs_dequeue
@cs_dequeue Ай бұрын
@@McClean974 уже давно) когда оставил коммент тогда уже)
@dmitriibalakshyi9473
@dmitriibalakshyi9473 Жыл бұрын
Очень доступно, супер спасибо!!!
@ISAWER1
@ISAWER1 Жыл бұрын
лайк и коммент в поддержку канала
@Developer_python_
@Developer_python_ 2 жыл бұрын
Тот случай когда сначала лайк!Почему так мало просмотров?Неужели так мало пайтонистов?
@ftb2024_official
@ftb2024_official Жыл бұрын
Спасибо вам большое 🤝
@yoruwamatahajimaru
@yoruwamatahajimaru Жыл бұрын
офигенно, еще и с синглтоном! спасибище
@DARIAFRAY
@DARIAFRAY 2 жыл бұрын
спасибо Вам за материал!
@ArtemUrdin
@ArtemUrdin 2 жыл бұрын
Молодчинка , лучший !!!
@elenamalysheva5647
@elenamalysheva5647 Жыл бұрын
Голос похожий на Николя Дроздова из "Мира животных"
@GROMOZEKA_NZT
@GROMOZEKA_NZT Жыл бұрын
Ты сломал моё восприятие уроков этим комментом. Теперь мне всегда кажется, что меня обучает Николай Дроздов
@gen121
@gen121 2 жыл бұрын
Большое спасибо
@PaltsevPro
@PaltsevPro 2 жыл бұрын
Вот теперь я понял для чего нужен del xD
@morkovka2005
@morkovka2005 Жыл бұрын
Очень крутое видео, но мозг бум-бум)
@jaksonmillka
@jaksonmillka 18 күн бұрын
Урок #4 = Пройден С одной стороны, __new__ понятен, а с другой - нет... Хоть вы и привели пример, где он может использоваться, но все равно, особой цели его не понятно. Единственное что понятно, так это то что, сначала вызывается __new__, а потом только __init__, и мы можем его контролировать, однако, конкретной цели его, мне пока что не ясна. Надеюсь в дальнейшем, я пойму, как его можно контролировать под определенную задачу
@jamjam3337
@jamjam3337 Жыл бұрын
Спасибо!👏
@0ver4ance
@0ver4ance Жыл бұрын
@Сергей Балакирев, а зачем вообще нужно писать финализатор __del__? Ведь он вызывается тогда, когда объект попадает в сборщик мусора, но он никогда туда не попадет, так как атрибут __instance все ровно будет ссылаться на объект, следовательно и счетчик ссылок на объект никогда не будет равен нулю, если только мы вручную не переназначим __instance на другой объект
@selfedu_rus
@selfedu_rus Жыл бұрын
он реально очень редко прописывается, только если что то нужно сделать с данными при удалении объекта
@antonivanov3830
@antonivanov3830 Жыл бұрын
@@selfedu_rus, а если без него все работает (я прогнал все то же самое без этого метода, результат тот же), для чего его здесь нужно было прописывать, возможно, есть какие-то примеры?
@nikitabbrv5947
@nikitabbrv5947 2 жыл бұрын
Ухх что-то __new__ тяжело заходит, особенно вместе с super)
@DavidDavid-zm1kj
@DavidDavid-zm1kj Жыл бұрын
Все очень доходчиво, но неплохо бы про __call__ досказать... Интересно ведь! Спасибо!!!
@johnmazepa
@johnmazepa Жыл бұрын
в уроке №12 досказывает))
@Konstantin_Stalnov
@Konstantin_Stalnov Жыл бұрын
12:40 Чтобы это поправить нужно просто return засунуть под if
@GROMOZEKA_NZT
@GROMOZEKA_NZT Жыл бұрын
Прочитал все комментарии и не нашлось ответа на вопрос: Если мы удаляем объект через команду del, то классовая переменная по идее должна автоматически None без метода __del__? А если мы не будем вручную удалять объект, а просто присвоем ссылку на другой, то получается в классе будет висеть переменная __instance с сылкой на объект и у нас не будет возможности его удалить командой del?
@bobby_ridge
@bobby_ridge 7 ай бұрын
Клевое объяснение Что значит __перед переменной?
@richardplantagenet4095
@richardplantagenet4095 5 ай бұрын
dunder method. Double UDERscore
@mason228x
@mason228x 5 ай бұрын
Это тоже самое что и диез # как ноты lya только при помощи языка lua в том числе UDERscore под double что не патч самого этого method но является еще и классом dunder что под имением super() выводится на главный образ
@gayratsaidakhmedov5451
@gayratsaidakhmedov5451 9 ай бұрын
спасибо
@ИгорьКлимов-м1ц
@ИгорьКлимов-м1ц 3 ай бұрын
Небольшое уточнение т.к возможно, оговорились: 1:15 cls - ссылка на сам класс. self - ссылка на текущий экземпляр класса (объект).
@ИгорьКлимов-м1ц
@ИгорьКлимов-м1ц 3 ай бұрын
UPD. Если мы имеем ввиду, что Объект - экземпляр класса
@ДарьяСнеговская-ъ4м
@ДарьяСнеговская-ъ4м 2 ай бұрын
Сергей, огромное спасибо вам за урок. Единственное, что осталось непонятным, - как переопределение метода `__call__` в примере с DataBase поможет избежать переопределения атрибутов в `__init__`? Почему вообще зашла речь о методе `__call__`, если объект класса здесь нигде сам по себе не вызывается? И как всё-таки избежать проблемы с переинициализацией? Я сходу могу придумать только что-то вроде индикатора, что объект уже был инициализирован - т.е. идейно того же самого __instance, с той только разницей, что он будет проверяться в `__init__`'е, уже после создания объекта. Например, так (упомянутый индикатор назван `__initialized`): ``` class DataBase: __instance = None __initialized = False def __new__: ... def __init__(self, user, psw, port): if __initialized == True: pass else: self.user = user ... ``` И как всё-таки будет по-правильному?
@Archewar
@Archewar Жыл бұрын
у меня вскипают мозги, но я что то начинаю понимать в отличии от других роликов про ооп где я не понимал ничего
@станиславзотов-д7у
@станиславзотов-д7у Жыл бұрын
А где бы почитать как использовать метод __call__ что бы значения атрибутов, при попытке новой инициализации, не менялись?
@RockstarAlexander
@RockstarAlexander 2 жыл бұрын
👍👍👍👍👍
@Alichok59
@Alichok59 Жыл бұрын
Вот пример паттерна Singleton, где свойсва экземпляров сохраняются: class MetaSingleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class Logger(metaclass=MetaSingleton): def __init__(self, age, jf,): self.age = age self.jf = jf logger1 = Logger('23', 55) logger2 = Logger('42', 77) print(logger1, logger2) print(logger1.__dict__) print(logger2.__dict__)
@selfedu_rus
@selfedu_rus Жыл бұрын
Класс!
@ДарьяСнеговская-ъ4м
@ДарьяСнеговская-ъ4м 2 ай бұрын
Спасибо за показанный вариант! Попыталась разобраться с ним, и первый вопрос, который возник при разборе (кстати, этот же вопрос возник и при просмотре @selfedu_rus про метод `__call__`): почему у вас переопределение метода `__call__` срабатывает для всего класса, а не для объекта этого класса? Как вы этого добились?
@МамонтовОлег-в9о
@МамонтовОлег-в9о 2 жыл бұрын
радует
@pip_install7496
@pip_install7496 Ай бұрын
Почему мы не можем вызвать магический метод __new__ у класса super без скобок? super.__new__(cls)
@TheSSUnit
@TheSSUnit Жыл бұрын
возможно уже писали, но cls (1:13) ссылается на сам класс(не экземпляр класса, если я не путаю)
@selfedu_rus
@selfedu_rus Жыл бұрын
В видео так и говорится, там только лишнее слово "экземпляр", нужно просто "класс". Но это из видео понятно совершенно четко.
@alexandrshoobenkov2163
@alexandrshoobenkov2163 11 ай бұрын
Примерно на 10 мин. 10 сек. в видео создается метод __del__ в котором значение __instanse вновь приравнивается к None. НО ведь в таком случае мы переопределяем метод __del__, и работать он просто не будет. Мы, как я понимаю, должны были строчкой ниже через super сослаться на нативный __del__ из старшего класса, от которого наследуемся. Или я что-то не понимаю? Спасибо!
@antoxxxa154
@antoxxxa154 2 жыл бұрын
__super__ !
@zakirovio
@zakirovio Жыл бұрын
добрый день. пишу конспект по ооп для собеса. Не подскажете, а правильно ли будет озвучить ответ на вопрос о __new__ в таком виде: Магический метод __new__ неявно вызывается интерпретатором перед созданием экземпляра класса и возвращает ссылку по которой будет создан объект и далее при помощи конструктора __init__ примет необходимые свойства.
@IncredibleSparrow
@IncredibleSparrow Жыл бұрын
Почему бы не запихнуть определение метода init в условный оператор в методе new? Или тогда он не будет автоматически вызываться при создании класса тогда?
@st0nedcreature17
@st0nedcreature17 3 ай бұрын
Откуда взялся id для db?))
@kurtmiller77
@kurtmiller77 2 жыл бұрын
Отличное видео, теперь корректно удаляем. Я бы лишь добавил, что синглтон считается антипаттерном и его следует использовать с осторожностью. Но на таком уровне сложно донести почему это так.
@ksymbescenny8859
@ksymbescenny8859 Жыл бұрын
Подскажите пожалуйста если в методе __new__ нужно как нибудь проверить параметры, в *args например, после чего создаеться новый обьект с помощью super().__new__(cls) - как их после проверки дальше перенаправить так же в *args далее в __init__ , как правильно прописать синтаксис аля: super().__new__(cls)(*args, **kwargs)
@Dragonoid_369_4
@Dragonoid_369_4 4 ай бұрын
не все понял. Это нужно для чего? Если по прошлым роликам даже на примере с котами. У меня класс св котором хранятся значения для котов. Экземпляры классов хранят в себе разных котов и их значения. Если у класса есть общее значение как цвет или размер у точек, то все экземпляры будут хранить эту информацию как общую? А в данном ролике я так понимаю если я создам экземпляр кота cat в нем будет например возраст = 10. Порода и еще что то и парочка общих значений. А потом захочу создать cat2 где по всем значениям и названиям(кроме общих) это будет полностью другой кот. то я не смогу этого сделать т.к на класс должен быть только 1 экземпляр? Тогда зачем этот класс нужен
@rattlik1
@rattlik1 2 жыл бұрын
Спасибо, интересно. Подскажите, стоит ли читать Лутца, если уже обладаешь средними знаниями Python?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Не знаю, не читал ))
@rattlik1
@rattlik1 2 жыл бұрын
@@selfedu_rus :)
@ИгорьЖуков-ч4б
@ИгорьЖуков-ч4б 2 жыл бұрын
@@rattlik1 Я тоже таким вопрос задавался) В итоге просто пробежался по оглавлению Лутца. Прочитал пару глав незнакомых и понял, что в принципе можно и без прочтения этой книги обойтись. Но книга действительно неплохая, особенно понравилось, что в конце глав даётся список вопросов, а потом подробные ответы. Не знаю, может быть так во всех книгах сейчас, но например, когда я в школе учился, не видел ни одного учебника, чтобы после теоретических вопросов потом давались ответы на них
@rattlik1
@rattlik1 2 жыл бұрын
@@ИгорьЖуков-ч4б большое спасибо!
@andruhaz
@andruhaz 2 жыл бұрын
IMHO стоит, особенно по ООП (том2), он там так все подробно объясняет, и по нескольку раз. Книга сама дорогая, но можно раздобыть электронную версию. Даже если ты что-то знаешь никогда не лишне взглянуть с какого-то другого угла, многое заново узнаешь
@slava6566
@slava6566 9 ай бұрын
как получаемые параметры *args и **kwargs методом __new__ передаются далее в __init__? ведь они из __new__ не передаются методу __new__ базового класса .. какой-то __new__ слишком магический метод))
@vlad161092
@vlad161092 Жыл бұрын
можешь, пожалуйста, прояснить, в контексте твоего примера: cls.__instance и DataBase.__instance = это тождественные понятия? Если да, то почему по-разному их пишем?
@selfedu_rus
@selfedu_rus Жыл бұрын
Да, одно и то же. Только cls доступен не во всех методах, а только в классовых (есть еще статик и обычные). Если есть cls - это рекомендуемая практика. В других методах приходится для записи в атрибут класса использовать имя класса.
@vlad161092
@vlad161092 Жыл бұрын
@@selfedu_rus финализатор __del__, он насколько критичен? Я так понял, что его вводят только для того, чтобы память чистить для быстродействия системы. Типа, если не прописал __del__, ну и ладно, не очень критично для самого выполнения кода
@selfedu_rus
@selfedu_rus Жыл бұрын
@@vlad161092 да, его редко используют, память чистить не нужно, т.к. Python (сборщик мусора) это делает автоматически
@richardplantagenet4095
@richardplantagenet4095 5 ай бұрын
А почему мы не можем просто вместо super() указать object? Ведь super просто - напросто возвращает аллокацию в памяти нашего базового класса object. P.S. Работает одинаково
@IvanDiiakonu
@IvanDiiakonu 2 жыл бұрын
Сергей добрый день ! Спасибо за ваш курс! Подскажите пожалуйста, я столкнулся с вот такой ошибкой в конце данного занятия: AttributeError: 'DataBase' object has no attribute 'user' Не могу понять что я делаю не правильно. Буду вам очень благодарен за помощь! Работаю в PyCharm Вот код как на видео: class DataBase: __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: cls.__instance = super().__new__(cls) return cls.__instance def __del__(self): DataBase.__instance = None def __int__(self, user, psw, port): self.user = user self.psw = psw self.port = port def connect(self): print(f"соединение с БД: {self.user}, {self.psw}, {self.port}") def close(self): print("закрытие соединение с БД") def read(self): return "данные из БД" def write(self, data): print(f"запись в БД {data}") db = DataBase('root', '1234', 80) db2 = DataBase('root2', '5678', 40) db.connect() db2.connect()
@selfedu_rus
@selfedu_rus 2 жыл бұрын
вы вместо init прописали int ))
@IvanDiiakonu
@IvanDiiakonu 2 жыл бұрын
@@selfedu_rus стыдоба....😨
@IvanDiiakonu
@IvanDiiakonu 2 жыл бұрын
​@@selfedu_rus спасибо большое !) даже не понимаю как я такое мог пропустить - много раз перепроверял, а на это даже не обратил ни малейшего внимания.
@void7573
@void7573 2 жыл бұрын
Магия и бесовщина этот ваш питон. Но спасибо за разъяснения!
@makooprime
@makooprime Жыл бұрын
Отличные уроки. Спасибо автору за труд. Но у меня остался вопрос почему в данном примере не работает финализатор __del__? то есть я удаляю db и db2, создаю db3, и id вновь созданного экземпляра остался тот же что был у db и db2.
@selfedu_rus
@selfedu_rus Жыл бұрын
он отработает, когда сборщик мусора соблаговолит удалить объект, а когда это произойдет никто не знает ))
@makooprime
@makooprime Жыл бұрын
@@selfedu_rus а если я принудительно пропишу del object_1 а потом создам object_2, почему в таком случае id(object_2) будет таким же как было id(object_1)
@selfedu_rus
@selfedu_rus Жыл бұрын
@@makooprime насколько я помню программу, там на объект ведет ссылка из класса cls.__instance, а значит, сборщик мусора не уничтожит объект в памяти. При создании нового, просто получите ссылку на уже существующий. Подробнее это можно спросить у сообщества телеграм-канала.
@AS-th7xe
@AS-th7xe Жыл бұрын
можете посоветовать сайт/курс на степике с задачами по практике по ООП?
@DmytroLarin
@DmytroLarin 2 жыл бұрын
Здравствуйте, очень понравился ваш урок, но есть небольшой вопросик. В методе __new__ для изминения значения __instance, Вы пишите cls.__instance, а в методе __del__ Вы пишите DataВase.__instance. В чем разница между этими двумя записями? Вроде как одно и тоже - все ссылается на класс DataBase... Или как?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
в данном случае да, но лучше использовать cls, т.к. имя класса программист может изменить, а в коде забыть поменять
@DmytroLarin
@DmytroLarin 2 жыл бұрын
@@selfedu_rus Понял, спасибо!
@МихаилПривалов-ч2я
@МихаилПривалов-ч2я Жыл бұрын
В методе __new__ cls ссылается на класс, поэтому для изменения значения __instance, пишут cls.__instance. У метода __del__ вместо cls self, а self ссылается на экземпляр класса, а не на сам класс как cls и поэтому, чтобы поменять атрибут класса (!не экземпляра класса) пишут (в нашем случае) DataBase.__instance, а не self. __instance.
@veahcen
@veahcen 10 ай бұрын
​@@selfedu_rusа как тогда правильно изменять атрибут класса, если в метод передается только self, как в __init__ или __del__? Ведь через self создастся новая переменная у экземпляра с таким же именем, а не изменится атрибут класса. Использовать type(self)?
@selfedu_rus
@selfedu_rus 10 ай бұрын
@@veahcen либо прописывать имя класса перед атрибутом (вместо self), либо (и чаще всего) создается метод класса (classmethod) и у него вместо self идет cls - ссылка на сам класс
@denisplotnikov6875
@denisplotnikov6875 2 жыл бұрын
Все здорово, но у меня возник вопрос: на какой уровень (junior, middle) спрашивают данные вещи?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
джун и это база )
@vb52ru
@vb52ru 2 жыл бұрын
Не понял что изменилось, вроде тот же урок
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Была ошибка при реализации паттерна Singleton, поправил
@sofiya41.
@sofiya41. 6 ай бұрын
1:19. Почему вы называете Класс экземпляром??, я уже запуталась что вы имеете в виду😢😢
@selfedu_rus
@selfedu_rus 6 ай бұрын
экземпляр = объект класса
@sofiya41.
@sofiya41. 6 ай бұрын
@@selfedu_rus ну да,, экземпляр это также и объект, например pt = Point, в данном случае pt - это экземпляр класса Point, , но ведь сам Point это не экземпляр, это Класс, Либо я что то не поняла?
@obsi1019
@obsi1019 Жыл бұрын
топ
@future_redesigned
@future_redesigned 4 ай бұрын
У меня при таком раскладе не срабатывает del
@МихаилПривалов-ч2я
@МихаилПривалов-ч2я Жыл бұрын
👀
@Sergey-cz7ym
@Sergey-cz7ym Жыл бұрын
10:13 подскажите, а можно вместо названия класса (DataBase.__instance = None) указать какую-то переменную, типа cls или super, но тут сдс не подойдет так его нет в области видимости переменных этого метода а super относится к родительскому классу, просто немного похоже на хардкодинг...
@Sergey-cz7ym
@Sergey-cz7ym Жыл бұрын
Всё, можно не отвечать, ответ есть в следующем видео :)
@AzizjanAyupov_leo
@AzizjanAyupov_leo 9 ай бұрын
так почему инит не сработал??
@pauline012t
@pauline012t 4 ай бұрын
А обязательно писать финализатор? Что может произойти, если попытаться обойтись без дандера __del__?
@selfedu_rus
@selfedu_rus 4 ай бұрын
можно и без него (чаще именно так и делают)
@pauline012t
@pauline012t 4 ай бұрын
@@selfedu_rus ок, спасибо за ответ и качественный материал!)
@Tragichorse
@Tragichorse Жыл бұрын
Не очень понимаю один момент: создается впечатление, что с помощью __new__ экземпляр создается на базе класса object, а не Point. Или экземпляр автоматически прикрепляется к дочернему классу?
@selfedu_rus
@selfedu_rus Жыл бұрын
На самом деле экземпляры создаются метаклассом type. Но это уже детали. Достаточно знать, что __new__ срабатывает непосредственно перед созданием объекта.
@Tragichorse
@Tragichorse Жыл бұрын
@@selfedu_rus спасибо:>
@dedpihto680
@dedpihto680 2 жыл бұрын
вот есть некий метод в некотором классе (готовая библиотека из интернета) . и мне нужно выполнить какието свои действия при вызове этого метода ну и потом запустить этот метод(уже из библиотеки) чтобы он свое отработал. но я даже не знаю где его искать и уж тем более как его дополнить чтобы он выполнил мои действия. подскажите плз
@МаксимАндреев-я1г
@МаксимАндреев-я1г 2 жыл бұрын
Перезалил, что-то новое добавил?!
@selfedu_rus
@selfedu_rus 2 жыл бұрын
да, ошибка в паттерне Singleton
@mksmvnv
@mksmvnv Жыл бұрын
у меня абсолютно так же код написан, но инит не вызывается(( в чем может быть косяк? вот код: class Point: def __new__(cls, *args, **kwargs): print('Вызов __new__ для' + str(cls)) return super().__new__(cls) def __int__(self, x=0, y=0): print('Вызов __init__ для' + str(self)) self.x = x self.y = y pt = Point(1, 5) print(pt) вот что принтуется: Вызов __new__ для без инита(
@AleksandrGurin
@AleksandrGurin 9 ай бұрын
Может быть уже увидели, но у вас название функции __int__ а должно быть __init__ из-за этой опечатки и не работает.
@syberia3798
@syberia3798 2 жыл бұрын
А почему в методе __new__ сам return не добавить во внутрь if. Тогда ведь и __init__не будет вызываться повторно? В этом же уроке в начале об этом говорилось? Зачем тогда нужен __call__? def __new__(...): if not cls.__instance: cls.__instance = super().__new__(cls) return cls.__instance
@selfedu_rus
@selfedu_rus 2 жыл бұрын
тогда при создании второго экземпляра будем получать None, а не ссылку на ранее созданный объект
@captaingames12
@captaingames12 Жыл бұрын
@@selfedu_rus а в чем разница между id и адресом объекта? И будут ли у db и db2 одинаковые адреса?
@ОлегСмирнов-ю3к
@ОлегСмирнов-ю3к 2 жыл бұрын
на сколько помню __instans нельзя изменить извне? потому что эта переменна закрыта __ вот такими подчеркиваниями?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
да, так лучше, согласен
@FreeUkraine4ever
@FreeUkraine4ever Жыл бұрын
Получается магич метод __new выполняется сам автоматом при создании экземпляра класса?
@selfedu_rus
@selfedu_rus Жыл бұрын
да
@mvo5450
@mvo5450 Жыл бұрын
Здравствуйте. Скажите, а почему в этом методе def __new... If cls... is None, a не == None, например..?
@selfedu_rus
@selfedu_rus Жыл бұрын
Так принято в Python делать проверку на None
@mvo5450
@mvo5450 Жыл бұрын
@@selfedu_rus , понял. Спасибо!
Spongebob ate Patrick 😱 #meme #spongebob #gmod
00:15
Mr. LoLo
Рет қаралды 21 МЛН
Life hack 😂 Watermelon magic box! #shorts by Leisi Crazy
00:17
Leisi Crazy
Рет қаралды 63 МЛН
Паттерн Singleton (Одиночка) в Python
36:55
Python Russian
Рет қаралды 12 М.
__new__ или __init__ в Python? Знаете ли вы это..
12:37
Паттерны проектирования на Python: Паттерн Фабричный метод
8:31
EngineerSpock - IT & программирование
Рет қаралды 25 М.
PYTHON MAGIC METHODS. __INIT__ и __NEW__
14:53
luchanos
Рет қаралды 6 М.
Принципы SOLID / С Примерами На Python
12:36
PyLounge - программирование на Python и всё о IT
Рет қаралды 14 М.