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

  Рет қаралды 135,945

selfedu

selfedu

2 жыл бұрын

Курс по Python ООП: stepik.org/a/116336
Как работает и зачем нужен магический метод _new_ в Python. Пример его использования при реализации паттерна Singleton.
Плейлист по Python ООП: • Объектно-ориентированн...
Инфо-сайт: proproprogs.ru/python_oop
Telegram-канал: t.me/python_selfedu

Пікірлер: 226
@web4453
@web4453 2 жыл бұрын
видно, что у человека порядок в голове и полное понимание темы. Потому информация, которую он доносит максимально легко усваивается. Спасибо
@user-ly7mq3fz7k
@user-ly7mq3fz7k Жыл бұрын
В этом ролкике поначалу было трудно , но после тщательного просмотра несколько раз, до меня ,наконец все дошло , по-моему , один из лучших курсов в СНГ по ООП
@mslq
@mslq 9 ай бұрын
Однозначно! Это лучшие видосы по пайтону, но всё равно я другие тоже засматриваюсь, для закрепления темы.
@katerikaL
@katerikaL 3 ай бұрын
ООП становится интересной темой. Огромнейшее спасибо, мне столько в институте не рассказывали сколько я от вас узнала❤‍🔥❤‍🔥
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 жыл бұрын
Ты абсолютный гений!!! Какая-то невероятная подача материала!!! Спасибо!!!
@Shishio58
@Shishio58 Жыл бұрын
Кто ты????? Откуда ты??? Просто пусть у тебя будет так же гладко по жизни как ты даешь материал! Лучший!!!!!!!!!!!
@maxholon
@maxholon 11 ай бұрын
Подача настолько хороша, что я уже прям чувствую, что скоро начну начинать понимать.
@non5309
@non5309 2 жыл бұрын
Спасибо автору за материалы. Адаптацию практики бы еще под этот новый материал - было бы супер. Да вообще я был бы не против заплатить на каком-нибудь степике за глубокий курс по ООП с хорошими задачами по практике
@UrTa91
@UrTa91 Жыл бұрын
Так они там вроде есть?
@NoName-hi8bv
@NoName-hi8bv Жыл бұрын
Наконец то всё просто и лаконично без взякий дёрганей. Кратко и по факту. Что как создаётся. Почему столь простые вещи так усложняют.
@user-td1ql3rq3d
@user-td1ql3rq3d 2 жыл бұрын
Очень качественная подача, браво!
@empty9228
@empty9228 2 жыл бұрын
Сергей, спасибо за урок! У вас отличная подача материала.
@igor-policee
@igor-policee 2 жыл бұрын
Прекрасные уроки, спасибо!
@vladimirastrelin1719
@vladimirastrelin1719 Жыл бұрын
Круто..Спасибо большое, важная тема. Подача как всегда на высоте!
@nightyum
@nightyum Жыл бұрын
Отличный канал по урокам на питон, всё понятно, спасибо большое!
@vladimirkulakov8667
@vladimirkulakov8667 2 жыл бұрын
Спасибо! Очень интересно и доходчиво! Чувствую как растет моя суперсила))))
@aleksandrsemenov1764
@aleksandrsemenov1764 2 жыл бұрын
Очень полезный материал, я уже год учу пайтон и информация по реализации Singleton очень кстати. Спасибо!
@nikitun85
@nikitun85 Жыл бұрын
Друже, неистово плюсуюсь к восхищающимся твоей подачей. Очень доходчиво!
@clqwnless
@clqwnless Жыл бұрын
Спасибо за очень хорошее объяснение! Мне понравилось очень сильно то, что вы добавили "__del__'!
@igorb.4917
@igorb.4917 2 жыл бұрын
Отличный курс, спасибо!
@user-qj6tk5fw9p
@user-qj6tk5fw9p Жыл бұрын
очень крутой урок, огромное спасибо за ваш труд!
@ccjx_space
@ccjx_space Жыл бұрын
Вы объясняете детали, которые у человека маловероятно, что выйдет получить читая книги. Большое Вам спасибо!
@yyykkk4175
@yyykkk4175 2 жыл бұрын
Теперь в уроке следующая проблема (Python 3.8.6) ----> при удалении экземпляра класса прописанный служебный метод __del__ не отрабатывает. Те он не меняет атрибут класса. Такое ощущение, что есть какие-то ref'ы к атрибуту именно класса от экземпляра, что препятствует правильному срабатыванию __del__ . Когда атрибут класса является чем либо, но не присваиваемым классом, все отрабатывает на ура, но когда атрибут - сам же класс, то тут начинаются проблемы. Тема с синглтонами весьма неоднозначна и имеет очень много подводных камней. PS Лайк все-равно поставил)))
@rogersmith3141
@rogersmith3141 7 ай бұрын
Объяснение просто огонь!
@KromlechKannabikus
@KromlechKannabikus Жыл бұрын
Мастерски подан материал. Благодарю
@gilman2056
@gilman2056 Жыл бұрын
ясно-спасибо, действительно подача материала хорошая все остальные ролик выше по запросу непонятно объясняют некоторые моменты
@VladislavVoronin-fc1fo
@VladislavVoronin-fc1fo Жыл бұрын
Уроки - моё почтение. 10/10
@yoruwamatahajimaru
@yoruwamatahajimaru Жыл бұрын
офигенно, еще и с синглтоном! спасибище
@dmitriibalakshyi9473
@dmitriibalakshyi9473 Жыл бұрын
Очень доступно, супер спасибо!!!
@user-fd8xw7ji2u
@user-fd8xw7ji2u 4 ай бұрын
Прочитала комментарии и хочется сказать - тут зрители аплодируют , апплодируют. Так понятно, что ни йуха не понятно.
@suslikest3708
@suslikest3708 10 ай бұрын
Топ! до этого видоса я не до конца понимал суть этого маг метода.
@cs_dequeue
@cs_dequeue 2 жыл бұрын
Супер обяснение! Было очень понятно и полезно. Пошел искать видео про магический метод __call__)
@user-mw8qm2nt7f
@user-mw8qm2nt7f 4 ай бұрын
Нашел что то?
@cs_dequeue
@cs_dequeue 4 ай бұрын
@@user-mw8qm2nt7f давно) магический метод __call__ делает инстансы(экземпляры) класса вызываемыми(callable), т е. если у нас есть класс MyClass у которого есть метод __call__, то m = MyClass, тут m экземпляр MyClass, и при m() - вызывается метод __call__. Так можно к примеру реализовать декораторы на основе классов. Это если вкратце. Пс: Возможно в этом видео это все уже сказано, комментарии мой старый, а видео не пересмотрел)
@nadyamoscow2461
@nadyamoscow2461 23 күн бұрын
Далеко ходили? Он же есть в этом же курсе
@DARIAFRAY
@DARIAFRAY 2 жыл бұрын
спасибо Вам за материал!
@matsveiv6712
@matsveiv6712 3 ай бұрын
Еще раз огромное спасибо! Было бы славно, если бы вы опубликовали код программы в описании для разбора и редактирования.
@vladislavshesternov8384
@vladislavshesternov8384 2 жыл бұрын
Конечно, огромный разрыв в понимании в сравнении с предыдущим курсом, хотя.. Может мне только так кажется, учитываю, что я его прошел и сейчас по сути занимаюсь повторением материала? Ну а так, огромное СПАСИБО автору, очень постарался, это прям видно =)
@user-jo5ij6df1d
@user-jo5ij6df1d Жыл бұрын
Спасибо за ещё одну порцию информации. Дааа... это, конечно, не "ООП за 15 минут"
@milash8861
@milash8861 4 ай бұрын
Наконец-то поняла, спасибо!❤
@ftb2024_official
@ftb2024_official Жыл бұрын
Спасибо вам большое 🤝
@user-mx1tp7cz4n
@user-mx1tp7cz4n 2 жыл бұрын
Молодчинка , лучший !!!
@andredru4278
@andredru4278 5 ай бұрын
Спасибо. Понятно. Вперед!
@Developer_python_
@Developer_python_ 2 жыл бұрын
Тот случай когда сначала лайк!Почему так мало просмотров?Неужели так мало пайтонистов?
@elenamalysheva5647
@elenamalysheva5647 Жыл бұрын
Голос похожий на Николя Дроздова из "Мира животных"
@GROMOZEKA_NZT
@GROMOZEKA_NZT Жыл бұрын
Ты сломал моё восприятие уроков этим комментом. Теперь мне всегда кажется, что меня обучает Николай Дроздов
@Receive_
@Receive_ 2 жыл бұрын
У меня одного сейчас мозг взорвется? Как было все легко до знакомства с ООП
@skeam9988
@skeam9988 Жыл бұрын
Не одной, всё нормально
@Volkswagen_official
@Volkswagen_official Жыл бұрын
Дорогу осилит идущий!
@Developer_python_
@Developer_python_ Жыл бұрын
next django)
@alexandr8153
@alexandr8153 Жыл бұрын
Я с ооп уже год топчусь на месте. Не читайте М. Лутца, он сложно о простом пишет
@gen121
@gen121 2 жыл бұрын
Большое спасибо
@ISAWER1
@ISAWER1 Жыл бұрын
лайк и коммент в поддержку канала
@jamjam3337
@jamjam3337 Жыл бұрын
Спасибо!👏
@PaltsevPro
@PaltsevPro 2 жыл бұрын
Вот теперь я понял для чего нужен del xD
@morkovka2005
@morkovka2005 Жыл бұрын
Очень крутое видео, но мозг бум-бум)
@Nick-zu9bi
@Nick-zu9bi 2 жыл бұрын
Спасибо
@DavidDavid-zm1kj
@DavidDavid-zm1kj Жыл бұрын
Все очень доходчиво, но неплохо бы про __call__ досказать... Интересно ведь! Спасибо!!!
@johnmazepa
@johnmazepa Жыл бұрын
в уроке №12 досказывает))
@linked_list_DLL
@linked_list_DLL 6 күн бұрын
Крч, для чайников, если кто не понял. В старых версиях python, когда мы определяли класс, мы всегда наследовались от базового object. Т.е, писали мы следующее: class (object): .После релиза python 3 этот синтаксис упростился и стали писать без наследования. Иными словами, функция super() неявно ссылается на суперкласс object, в котором вызывается дандер __new__, а в аргумент этого дандера закидываем ссылку на наш созданный класс (класс Point).
@nikitabbrv5947
@nikitabbrv5947 2 жыл бұрын
Ухх что-то __new__ тяжело заходит, особенно вместе с super)
@Konstantin_Stalnov
@Konstantin_Stalnov Жыл бұрын
12:40 Чтобы это поправить нужно просто return засунуть под if
@gayratsaidakhmedov5451
@gayratsaidakhmedov5451 6 ай бұрын
спасибо
@user-et4if5gs8z
@user-et4if5gs8z 2 жыл бұрын
радует
@user-oq5su6nn3v
@user-oq5su6nn3v Жыл бұрын
А где бы почитать как использовать метод __call__ что бы значения атрибутов, при попытке новой инициализации, не менялись?
@GROMOZEKA_NZT
@GROMOZEKA_NZT Жыл бұрын
Прочитал все комментарии и не нашлось ответа на вопрос: Если мы удаляем объект через команду del, то классовая переменная по идее должна автоматически None без метода __del__? А если мы не будем вручную удалять объект, а просто присвоем ссылку на другой, то получается в классе будет висеть переменная __instance с сылкой на объект и у нас не будет возможности его удалить командой del?
@user-xo7gr7pt7v
@user-xo7gr7pt7v 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 ... ``` И как всё-таки будет по-правильному?
@ksymbescenny8859
@ksymbescenny8859 Жыл бұрын
Подскажите пожалуйста если в методе __new__ нужно как нибудь проверить параметры, в *args например, после чего создаеться новый обьект с помощью super().__new__(cls) - как их после проверки дальше перенаправить так же в *args далее в __init__ , как правильно прописать синтаксис аля: super().__new__(cls)(*args, **kwargs)
@Archewar
@Archewar Жыл бұрын
у меня вскипают мозги, но я что то начинаю понимать в отличии от других роликов про ооп где я не понимал ничего
@zakirovio
@zakirovio Жыл бұрын
добрый день. пишу конспект по ооп для собеса. Не подскажете, а правильно ли будет озвучить ответ на вопрос о __new__ в таком виде: Магический метод __new__ неявно вызывается интерпретатором перед созданием экземпляра класса и возвращает ссылку по которой будет создан объект и далее при помощи конструктора __init__ примет необходимые свойства.
@impellergimpeller5133
@impellergimpeller5133 2 жыл бұрын
👍👍👍👍👍
@bobby_ridge
@bobby_ridge 5 ай бұрын
Клевое объяснение Что значит __перед переменной?
@richardplantagenet4095
@richardplantagenet4095 3 ай бұрын
dunder method. Double UDERscore
@mason228x
@mason228x 3 ай бұрын
Это тоже самое что и диез # как ноты lya только при помощи языка lua в том числе UDERscore под double что не патч самого этого method но является еще и классом dunder что под имением super() выводится на главный образ
@alexandrshoobenkov2163
@alexandrshoobenkov2163 9 ай бұрын
Примерно на 10 мин. 10 сек. в видео создается метод __del__ в котором значение __instanse вновь приравнивается к None. НО ведь в таком случае мы переопределяем метод __del__, и работать он просто не будет. Мы, как я понимаю, должны были строчкой ниже через super сослаться на нативный __del__ из старшего класса, от которого наследуемся. Или я что-то не понимаю? Спасибо!
@AS-th7xe
@AS-th7xe Жыл бұрын
можете посоветовать сайт/курс на степике с задачами по практике по ООП?
@user-pf8cc8wg3q
@user-pf8cc8wg3q Ай бұрын
Небольшое уточнение т.к возможно, оговорились: 1:15 cls - ссылка на сам класс. self - ссылка на текущий экземпляр класса (объект).
@user-pf8cc8wg3q
@user-pf8cc8wg3q Ай бұрын
UPD. Если мы имеем ввиду, что Объект - экземпляр класса
@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 спасибо большое !) даже не понимаю как я такое мог пропустить - много раз перепроверял, а на это даже не обратил ни малейшего внимания.
@dedpihto680
@dedpihto680 Жыл бұрын
вот есть некий метод в некотором классе (готовая библиотека из интернета) . и мне нужно выполнить какието свои действия при вызове этого метода ну и потом запустить этот метод(уже из библиотеки) чтобы он свое отработал. но я даже не знаю где его искать и уж тем более как его дополнить чтобы он выполнил мои действия. подскажите плз
@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 Жыл бұрын
Класс!
@user-xo7gr7pt7v
@user-xo7gr7pt7v 2 күн бұрын
Спасибо за показанный вариант! Попыталась разобраться с ним, и первый вопрос, который возник при разборе (кстати, этот же вопрос возник и при просмотре @selfedu_rus про метод `__call__`): почему у вас переопределение метода `__call__` срабатывает для всего класса, а не для объекта этого класса? Как вы этого добились?
@ms77grz
@ms77grz Жыл бұрын
👍👍
@antoxxxa154
@antoxxxa154 Жыл бұрын
__super__ !
@IncredibleSparrow
@IncredibleSparrow 10 ай бұрын
Почему бы не запихнуть определение метода init в условный оператор в методе new? Или тогда он не будет автоматически вызываться при создании класса тогда?
@rattlik1
@rattlik1 2 жыл бұрын
Спасибо, интересно. Подскажите, стоит ли читать Лутца, если уже обладаешь средними знаниями Python?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Не знаю, не читал ))
@rattlik1
@rattlik1 2 жыл бұрын
@@selfedu_rus :)
@user-bw4xg8tb9r
@user-bw4xg8tb9r 2 жыл бұрын
@@rattlik1 Я тоже таким вопрос задавался) В итоге просто пробежался по оглавлению Лутца. Прочитал пару глав незнакомых и понял, что в принципе можно и без прочтения этой книги обойтись. Но книга действительно неплохая, особенно понравилось, что в конце глав даётся список вопросов, а потом подробные ответы. Не знаю, может быть так во всех книгах сейчас, но например, когда я в школе учился, не видел ни одного учебника, чтобы после теоретических вопросов потом давались ответы на них
@rattlik1
@rattlik1 2 жыл бұрын
@@user-bw4xg8tb9r большое спасибо!
@andruhaz
@andruhaz 2 жыл бұрын
IMHO стоит, особенно по ООП (том2), он там так все подробно объясняет, и по нескольку раз. Книга сама дорогая, но можно раздобыть электронную версию. Даже если ты что-то знаешь никогда не лишне взглянуть с какого-то другого угла, многое заново узнаешь
@dmitrystelmakhov848
@dmitrystelmakhov848 2 жыл бұрын
Приветствую! Этот курс будет аналогичен предыдущему по ООП? Не успел тот досмотреть.
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Нет, этот больше и глубже
@dmitrystelmakhov848
@dmitrystelmakhov848 2 жыл бұрын
@@selfedu_rus Класс!) Отличный материал!
@0ver4ance
@0ver4ance Жыл бұрын
@Сергей Балакирев, а зачем вообще нужно писать финализатор __del__? Ведь он вызывается тогда, когда объект попадает в сборщик мусора, но он никогда туда не попадет, так как атрибут __instance все ровно будет ссылаться на объект, следовательно и счетчик ссылок на объект никогда не будет равен нулю, если только мы вручную не переназначим __instance на другой объект
@selfedu_rus
@selfedu_rus Жыл бұрын
он реально очень редко прописывается, только если что то нужно сделать с данными при удалении объекта
@antonivanov3830
@antonivanov3830 Жыл бұрын
@@selfedu_rus, а если без него все работает (я прогнал все то же самое без этого метода, результат тот же), для чего его здесь нужно было прописывать, возможно, есть какие-то примеры?
@kurtmiller77
@kurtmiller77 2 жыл бұрын
Отличное видео, теперь корректно удаляем. Я бы лишь добавил, что синглтон считается антипаттерном и его следует использовать с осторожностью. Но на таком уровне сложно донести почему это так.
@Sergey-cz7ym
@Sergey-cz7ym Жыл бұрын
10:13 подскажите, а можно вместо названия класса (DataBase.__instance = None) указать какую-то переменную, типа cls или super, но тут сдс не подойдет так его нет в области видимости переменных этого метода а super относится к родительскому классу, просто немного похоже на хардкодинг...
@Sergey-cz7ym
@Sergey-cz7ym Жыл бұрын
Всё, можно не отвечать, ответ есть в следующем видео :)
@obsi1019
@obsi1019 Жыл бұрын
топ
@user-qx2uw4qg1h
@user-qx2uw4qg1h 2 жыл бұрын
на сколько помню __instans нельзя изменить извне? потому что эта переменна закрыта __ вот такими подчеркиваниями?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
да, так лучше, согласен
@vlad161092
@vlad161092 Жыл бұрын
можешь, пожалуйста, прояснить, в контексте твоего примера: cls.__instance и DataBase.__instance = это тождественные понятия? Если да, то почему по-разному их пишем?
@selfedu_rus
@selfedu_rus Жыл бұрын
Да, одно и то же. Только cls доступен не во всех методах, а только в классовых (есть еще статик и обычные). Если есть cls - это рекомендуемая практика. В других методах приходится для записи в атрибут класса использовать имя класса.
@vlad161092
@vlad161092 Жыл бұрын
@@selfedu_rus финализатор __del__, он насколько критичен? Я так понял, что его вводят только для того, чтобы память чистить для быстродействия системы. Типа, если не прописал __del__, ну и ладно, не очень критично для самого выполнения кода
@selfedu_rus
@selfedu_rus Жыл бұрын
@@vlad161092 да, его редко используют, память чистить не нужно, т.к. Python (сборщик мусора) это делает автоматически
@user-pv6ut2uo3t
@user-pv6ut2uo3t 2 жыл бұрын
Здравствуйте! Подскажите, пожалуйста, как можно практиковаться по теме ООП? Нет ли задач, например как на stepic?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Создаю. Будут через месяц-два на степике
@user-pv6ut2uo3t
@user-pv6ut2uo3t 2 жыл бұрын
@@selfedu_rus Вот это отличные новости! Спасибо!
@user-zb4qi5fz4o
@user-zb4qi5fz4o 2 жыл бұрын
@@selfedu_rus Доброго времени суток. Когда примерно появится курс?)
@selfedu_rus
@selfedu_rus 2 жыл бұрын
@@user-zb4qi5fz4o через месяц точно, возможно раньше, работаю
@user-zb4qi5fz4o
@user-zb4qi5fz4o 2 жыл бұрын
@@selfedu_rus спасибо, будем ждать)
@TheSSUnit
@TheSSUnit Жыл бұрын
возможно уже писали, но cls (1:13) ссылается на сам класс(не экземпляр класса, если я не путаю)
@selfedu_rus
@selfedu_rus Жыл бұрын
В видео так и говорится, там только лишнее слово "экземпляр", нужно просто "класс". Но это из видео понятно совершенно четко.
@denisplotnikov6875
@denisplotnikov6875 2 жыл бұрын
Все здорово, но у меня возник вопрос: на какой уровень (junior, middle) спрашивают данные вещи?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
джун и это база )
@mvo5450
@mvo5450 Жыл бұрын
Здравствуйте. Скажите, а почему в этом методе def __new... If cls... is None, a не == None, например..?
@selfedu_rus
@selfedu_rus Жыл бұрын
Так принято в Python делать проверку на None
@mvo5450
@mvo5450 Жыл бұрын
@@selfedu_rus , понял. Спасибо!
@st0nedcreature17
@st0nedcreature17 21 күн бұрын
Откуда взялся id для db?))
@user-et2du5oz6j
@user-et2du5oz6j 2 жыл бұрын
Добрый день у меня вопрос, а зачем в принципе нужен __new__ если в прошлом уроке мы спокойно присваивали новые атрибуты с помощью метода __init__ в строке: "pt = Point(1,2)"
@selfedu_rus
@selfedu_rus 2 жыл бұрын
для более тонкого управления созданием объекта, например, паттерн Singleton без new не сделать
@eugenesemin4082
@eugenesemin4082 2 жыл бұрын
__init__ выполняется сразу после создания объекта - создался объект по такому-то адресу, выполнился __init__, который определил заданные в нем параметры. __new__ вызывается для создания экземпляра класса. По сути, он вызывается всегда из базового (или как еще называют - суперкласса (отсюда и метод super()) класса, при создании экземпляра какого-либо класса. Просто в данном уроке покзано переопределение этого метода внутри класса, чтобы произвести нужные манипуляции до создания его экземпляра. Т.е. если совсем крато __new__ создает новый экземпляр. __init__ работает с уже созданным с помощью __new__ экеземпляром.
@hellog888
@hellog888 Жыл бұрын
возникла ошибка: AttributeError: 'NoneType' object has no attribute 'connect', при попытке использовать db.connect() db2.connect() в чем причина? ведь ранее переданы были атрибуты для экземпляра db = DataBase("root", "1234", 80) db32 = DataBase("admin", "6677", 40)
@selfedu_rus
@selfedu_rus Жыл бұрын
должно работать, посмотрите на что ссылаются переменные db (должны на объект класса DataBase
@Dragonoid_369_4
@Dragonoid_369_4 2 ай бұрын
не все понял. Это нужно для чего? Если по прошлым роликам даже на примере с котами. У меня класс св котором хранятся значения для котов. Экземпляры классов хранят в себе разных котов и их значения. Если у класса есть общее значение как цвет или размер у точек, то все экземпляры будут хранить эту информацию как общую? А в данном ролике я так понимаю если я создам экземпляр кота cat в нем будет например возраст = 10. Порода и еще что то и парочка общих значений. А потом захочу создать cat2 где по всем значениям и названиям(кроме общих) это будет полностью другой кот. то я не смогу этого сделать т.к на класс должен быть только 1 экземпляр? Тогда зачем этот класс нужен
@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, а значит, сборщик мусора не уничтожит объект в памяти. При создании нового, просто получите ссылку на уже существующий. Подробнее это можно спросить у сообщества телеграм-канала.
@user-qe5rf3wo6n
@user-qe5rf3wo6n 2 жыл бұрын
# Реализация Singletona class Data: __in = None def __new__(cls, *args, **kwargs): if cls.__in == None: # то есть ЭК ещё ни разу не создавался ! cls.__in = super().__new__(cls) # Наследование от базового класса Object, super().__new__(cls) return cls.__in # А если он уже был, тогда - просто возвращается прежнее super().__new__(cls) def __init__(self, name = "Cary"): # При создании ЭК ему передаётся один аргумент, или может не передаваться ничего self.name = name def get_name(self): # Функция показывает значение атрибута name print(self.name) def get_in(self): print(self.__in) def set_in(self, inw): self.__in = inw d = Data("Coca") # Передаю имя Соса d.get_name() # Печатаю его d2 = Data() # Создаю ЭК, не передавая аргумента d2.get_name() # По умолчанию Cary Data.get_name(d) # снова выводится Cary d3 = Data("Gucha") # Создаю ЭК, передаю имя Gucha Data.get_name(d) # Печатаю name ЭК - d ( a не d3) = Gucha print(d.__dict__) # Печатаю словарь d {'name': 'Gucha'} - там переопределяется атрибут name d.get_in() # d.set_in("jjj") # устанавливаю новое значение свойства __in d.get_in() # Печатается jjj d2.get_in() # Печатается jjj print(d.__dict__, d2.__dict__, d3.__dict__, sep = " ") # {'name': 'Gucha', '_Data__in': 'jjj'} # {'name': 'Gucha', '_Data__in': 'jjj'} # {'name': 'Gucha', '_Data__in': 'jjj'} print(id(d), id(d2), id(d3), sep = " ") # 2009777865200 # 2009777865200 # 2009777865200
@void7573
@void7573 2 жыл бұрын
Магия и бесовщина этот ваш питон. Но спасибо за разъяснения!
@slava6566
@slava6566 7 ай бұрын
как получаемые параметры *args и **kwargs методом __new__ передаются далее в __init__? ведь они из __new__ не передаются методу __new__ базового класса .. какой-то __new__ слишком магический метод))
@pauline012t
@pauline012t 2 ай бұрын
А обязательно писать финализатор? Что может произойти, если попытаться обойтись без дандера __del__?
@selfedu_rus
@selfedu_rus 2 ай бұрын
можно и без него (чаще именно так и делают)
@pauline012t
@pauline012t 2 ай бұрын
@@selfedu_rus ок, спасибо за ответ и качественный материал!)
@SaVa_144
@SaVa_144 Жыл бұрын
Как я понимаю курс на степике жители других стран не могут приобрести?
@mao13132
@mao13132 Жыл бұрын
Почему в методе del не super а имя класса? При переименовании классов придётся вносить коррективы?
@selfedu_rus
@selfedu_rus Жыл бұрын
super() - это обращение к базовому классу; здесь нам нужно менять атрибут текущего класса, поэтому прописывается его имя явно
@mao13132
@mao13132 Жыл бұрын
@@selfedu_rus спасибо за ответ. Как Вы тренируете мозг что он может осознать столько сложной информации? Изучаю Ваши труды - огромное спасибо
@FreeUkraine4ever
@FreeUkraine4ever Жыл бұрын
Получается магич метод __new выполняется сам автоматом при создании экземпляра класса?
@selfedu_rus
@selfedu_rus Жыл бұрын
да
@Tragichorse
@Tragichorse Жыл бұрын
Не очень понимаю один момент: создается впечатление, что с помощью __new__ экземпляр создается на базе класса object, а не Point. Или экземпляр автоматически прикрепляется к дочернему классу?
@selfedu_rus
@selfedu_rus Жыл бұрын
На самом деле экземпляры создаются метаклассом type. Но это уже детали. Достаточно знать, что __new__ срабатывает непосредственно перед созданием объекта.
@Tragichorse
@Tragichorse Жыл бұрын
@@selfedu_rus спасибо:>
@user-to8dm8tv4g
@user-to8dm8tv4g 8 ай бұрын
спасибо, все понятно. Единственное, как я не пытался так и не смог добиться вызова __del__, ссылка есть всегда и никогда не сбрасывается
@selfedu_rus
@selfedu_rus 8 ай бұрын
это непредсказуемое поведение, но он точно вызывается при удалении объекта из памяти (ее освобождения)
@user-de3op9hs4p
@user-de3op9hs4p 7 ай бұрын
Ссылки на объект класса не всегда явные, и обнаружить их вручную порой затруднительно. Надо пройтись по всем спискам, словарям и т.п. Может где-то объект сравнивается с чем-то. Иногда удаление всех ссылок на объект класса невозможно, пока код выполняется. При прекращении выполнения кода все ссылки удаляться и метод __del__ обязательно отработает. Но иногда это реально доставляет геморрой. Например, есть игра, ну скажем, классический сапёр. Я его написал с помощью pygame. Там есть возможность при проигрыше не запуская заново код, начать новую игру. Естественно, все данные из прошлой игры должны удалиться, что явно и делается. Но остаются неявные ссылки на объект класса Мины, например, которые если удалить, то игра не запуститься заново, вылетит исключение. Так вот, если долго играть, в конце этих объектов накапливается под тысячу, занимая память. Деструктор их не удаляет, так как ссылки на них нужны для правильной работы кода.
@future_redesigned
@future_redesigned Ай бұрын
У меня при таком раскладе не срабатывает del
@AzizjanAyupov_leo
@AzizjanAyupov_leo 6 ай бұрын
так почему инит не сработал??
@user-qv8gn1yq8t
@user-qv8gn1yq8t Жыл бұрын
👀
@user-dj4np3gg9y
@user-dj4np3gg9y Жыл бұрын
Красавчик
F-строка. F-string. Программирование на Python
10:08
Beautiful gymnastics 😍☺️
00:15
Lexa_Merin
Рет қаралды 15 МЛН
A teacher captured the cutest moment at the nursery #shorts
00:33
Fabiosa Stories
Рет қаралды 21 МЛН
Паттерн Singleton (Одиночка) в Python
36:55
Python Russian
Рет қаралды 11 М.
Чего ожидать от HTTP/3 + Go
51:07
Нина Пакшина
Рет қаралды 4,9 М.
The Factory Pattern in Python // Separate Creation From Use
14:58
Паттерны проектирования на Python: Паттерн Фабричный метод
8:31
EngineerSpock - IT & программирование
Рет қаралды 25 М.