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

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

Комментарии • 214

  • @web4453
    @web4453 Год назад +110

    видно, что у человека порядок в голове и полное понимание темы. Потому информация, которую он доносит максимально легко усваивается. Спасибо

  • @maxholon
    @maxholon 8 месяцев назад +7

    Подача настолько хороша, что я уже прям чувствую, что скоро начну начинать понимать.

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n 2 года назад +95

    Ты абсолютный гений!!! Какая-то невероятная подача материала!!! Спасибо!!!

  • @katerina7944
    @katerina7944 Месяц назад +3

    ООП становится интересной темой. Огромнейшее спасибо, мне столько в институте не рассказывали сколько я от вас узнала❤‍🔥❤‍🔥

  • @Shishio58
    @Shishio58 Год назад +25

    Кто ты????? Откуда ты??? Просто пусть у тебя будет так же гладко по жизни как ты даешь материал! Лучший!!!!!!!!!!!

  • @user-ly7mq3fz7k
    @user-ly7mq3fz7k Год назад +31

    В этом ролкике поначалу было трудно , но после тщательного просмотра несколько раз, до меня ,наконец все дошло , по-моему , один из лучших курсов в СНГ по ООП

    • @mslq
      @mslq 7 месяцев назад

      Однозначно! Это лучшие видосы по пайтону, но всё равно я другие тоже засматриваюсь, для закрепления темы.

  • @igor-policee
    @igor-policee 2 года назад +9

    Прекрасные уроки, спасибо!

  • @user-td1ql3rq3d
    @user-td1ql3rq3d 2 года назад +28

    Очень качественная подача, браво!

  • @NoName-hi8bv
    @NoName-hi8bv Год назад +4

    Наконец то всё просто и лаконично без взякий дёрганей. Кратко и по факту. Что как создаётся. Почему столь простые вещи так усложняют.

  • @empty9228
    @empty9228 Год назад +1

    Сергей, спасибо за урок! У вас отличная подача материала.

  • @igorb.4917
    @igorb.4917 2 года назад +5

    Отличный курс, спасибо!

  • @vladimirastrelin1719
    @vladimirastrelin1719 Год назад +1

    Круто..Спасибо большое, важная тема. Подача как всегда на высоте!

  • @matsveiv6712
    @matsveiv6712 19 дней назад +1

    Еще раз огромное спасибо! Было бы славно, если бы вы опубликовали код программы в описании для разбора и редактирования.

  • @NightYum
    @NightYum Год назад +2

    Отличный канал по урокам на питон, всё понятно, спасибо большое!

  • @non5309
    @non5309 2 года назад +35

    Спасибо автору за материалы. Адаптацию практики бы еще под этот новый материал - было бы супер. Да вообще я был бы не против заплатить на каком-нибудь степике за глубокий курс по ООП с хорошими задачами по практике

    • @UrTa91
      @UrTa91 Год назад

      Так они там вроде есть?

  • @user-qj6tk5fw9p
    @user-qj6tk5fw9p 10 месяцев назад +2

    очень крутой урок, огромное спасибо за ваш труд!

  • @vladimirkulakov8667
    @vladimirkulakov8667 2 года назад +6

    Спасибо! Очень интересно и доходчиво! Чувствую как растет моя суперсила))))

  • @aleksandrsemenov1764
    @aleksandrsemenov1764 2 года назад +1

    Очень полезный материал, я уже год учу пайтон и информация по реализации Singleton очень кстати. Спасибо!

  • @nikitun85
    @nikitun85 Год назад +2

    Друже, неистово плюсуюсь к восхищающимся твоей подачей. Очень доходчиво!

  • @clqwnless
    @clqwnless 10 месяцев назад +2

    Спасибо за очень хорошее объяснение! Мне понравилось очень сильно то, что вы добавили "__del__'!

  • @KromlechKannabikus
    @KromlechKannabikus Год назад +1

    Мастерски подан материал. Благодарю

  • @rogersmith3141
    @rogersmith3141 5 месяцев назад +1

    Объяснение просто огонь!

  • @ccjx_space
    @ccjx_space 11 месяцев назад +2

    Вы объясняете детали, которые у человека маловероятно, что выйдет получить читая книги. Большое Вам спасибо!

  • @suslikest3708
    @suslikest3708 7 месяцев назад +1

    Топ! до этого видоса я не до конца понимал суть этого маг метода.

  • @dmitriibalakshyi9473
    @dmitriibalakshyi9473 11 месяцев назад +1

    Очень доступно, супер спасибо!!!

  • @gilman2056
    @gilman2056 Год назад +1

    ясно-спасибо, действительно подача материала хорошая все остальные ролик выше по запросу непонятно объясняют некоторые моменты

  • @DARIAFRAY
    @DARIAFRAY Год назад +1

    спасибо Вам за материал!

  • @VladislavVoronin-fc1fo
    @VladislavVoronin-fc1fo Год назад

    Уроки - моё почтение. 10/10

  • @ftb2024_official
    @ftb2024_official Год назад +1

    Спасибо вам большое 🤝

  • @yoruwamatahajimaru
    @yoruwamatahajimaru Год назад

    офигенно, еще и с синглтоном! спасибище

  • @milash8861
    @milash8861 Месяц назад +1

    Наконец-то поняла, спасибо!❤

  • @yyykkk4175
    @yyykkk4175 2 года назад +5

    Теперь в уроке следующая проблема (Python 3.8.6) ----> при удалении экземпляра класса прописанный служебный метод __del__ не отрабатывает. Те он не меняет атрибут класса. Такое ощущение, что есть какие-то ref'ы к атрибуту именно класса от экземпляра, что препятствует правильному срабатыванию __del__ . Когда атрибут класса является чем либо, но не присваиваемым классом, все отрабатывает на ура, но когда атрибут - сам же класс, то тут начинаются проблемы. Тема с синглтонами весьма неоднозначна и имеет очень много подводных камней.
    PS Лайк все-равно поставил)))

  • @andredru4278
    @andredru4278 2 месяца назад +1

    Спасибо. Понятно. Вперед!

  • @user-mx1tp7cz4n
    @user-mx1tp7cz4n 2 года назад +1

    Молодчинка , лучший !!!

  • @cs_dequeue
    @cs_dequeue Год назад +2

    Супер обяснение! Было очень понятно и полезно. Пошел искать видео про магический метод __call__)

    • @user-mw8qm2nt7f
      @user-mw8qm2nt7f 2 месяца назад

      Нашел что то?

    • @cs_dequeue
      @cs_dequeue 2 месяца назад

      @@user-mw8qm2nt7f давно) магический метод __call__ делает инстансы(экземпляры) класса вызываемыми(callable), т е. если у нас есть класс MyClass у которого есть метод __call__, то m = MyClass, тут m экземпляр MyClass, и при m() - вызывается метод __call__. Так можно к примеру реализовать декораторы на основе классов. Это если вкратце.
      Пс:
      Возможно в этом видео это все уже сказано, комментарии мой старый, а видео не пересмотрел)

  • @vladislavshesternov8384
    @vladislavshesternov8384 2 года назад +7

    Конечно, огромный разрыв в понимании в сравнении с предыдущим курсом, хотя.. Может мне только так кажется, учитываю, что я его прошел и сейчас по сути занимаюсь повторением материала? Ну а так, огромное СПАСИБО автору, очень постарался, это прям видно =)

  • @gen121
    @gen121 2 года назад +1

    Большое спасибо

  • @user-jo5ij6df1d
    @user-jo5ij6df1d Год назад +1

    Спасибо за ещё одну порцию информации. Дааа... это, конечно, не "ООП за 15 минут"

  • @jamjam3337
    @jamjam3337 Год назад +1

    Спасибо!👏

  • @Receive_
    @Receive_ Год назад +77

    У меня одного сейчас мозг взорвется? Как было все легко до знакомства с ООП

    • @skeam9988
      @skeam9988 Год назад +2

      Не одной, всё нормально

    • @Volkswagen_official
      @Volkswagen_official Год назад +4

      Дорогу осилит идущий!

    • @Developer_python_
      @Developer_python_ Год назад +5

      next django)

    • @alexandr8153
      @alexandr8153 11 месяцев назад +2

      Я с ооп уже год топчусь на месте.
      Не читайте М. Лутца, он сложно о простом пишет

  • @ISAWER1
    @ISAWER1 10 месяцев назад +1

    лайк и коммент в поддержку канала

  • @Nick-zu9bi
    @Nick-zu9bi 2 года назад +1

    Спасибо

  • @user-fd8xw7ji2u
    @user-fd8xw7ji2u 2 месяца назад +1

    Прочитала комментарии и хочется сказать - тут зрители аплодируют , апплодируют. Так понятно, что ни йуха не понятно.

  • @Developer_python_
    @Developer_python_ Год назад +1

    Тот случай когда сначала лайк!Почему так мало просмотров?Неужели так мало пайтонистов?

  • @GROMOZEKA_NZT
    @GROMOZEKA_NZT Год назад +4

    Прочитал все комментарии и не нашлось ответа на вопрос: Если мы удаляем объект через команду del, то классовая переменная по идее должна автоматически None без метода __del__? А если мы не будем вручную удалять объект, а просто присвоем ссылку на другой, то получается в классе будет висеть переменная __instance с сылкой на объект и у нас не будет возможности его удалить командой del?

  • @gayratsaidakhmedov5451
    @gayratsaidakhmedov5451 4 месяца назад +1

    спасибо

  • @wotlivehannel4612
    @wotlivehannel4612 2 месяца назад +1

    Клевое объяснение
    Что значит __перед переменной?

    • @richardplantagenet4095
      @richardplantagenet4095 28 дней назад

      dunder method. Double UDERscore

    • @mason4302
      @mason4302 17 дней назад

      Это тоже самое что и диез # как ноты lya только при помощи языка lua в том числе UDERscore под double что не патч самого этого method но является еще и классом dunder что под имением super() выводится на главный образ

  • @Konstantin_Stalnov
    @Konstantin_Stalnov Год назад +1

    12:40 Чтобы это поправить нужно просто return засунуть под if

  • @morkovka2005
    @morkovka2005 Год назад +1

    Очень крутое видео, но мозг бум-бум)

  • @user-et4if5gs8z
    @user-et4if5gs8z 2 года назад +1

    радует

  • @IncredibleSparrow
    @IncredibleSparrow 8 месяцев назад +1

    Почему бы не запихнуть определение метода init в условный оператор в методе new? Или тогда он не будет автоматически вызываться при создании класса тогда?

  • @ksymbescenny8859
    @ksymbescenny8859 Год назад +1

    Подскажите пожалуйста если в методе __new__ нужно как нибудь проверить параметры, в *args например, после чего создаеться новый обьект с помощью super().__new__(cls) - как их после проверки дальше перенаправить так же в *args далее в __init__ , как правильно прописать синтаксис аля:
    super().__new__(cls)(*args, **kwargs)

  • @PaltsevPro
    @PaltsevPro 2 года назад +2

    Вот теперь я понял для чего нужен del xD

  • @user-oq5su6nn3v
    @user-oq5su6nn3v Год назад +2

    А где бы почитать как использовать метод __call__ что бы значения атрибутов, при попытке новой инициализации, не менялись?

  • @nikitabbrv5947
    @nikitabbrv5947 2 года назад +4

    Ухх что-то __new__ тяжело заходит, особенно вместе с super)

  • @zakirovio
    @zakirovio 11 месяцев назад +2

    добрый день. пишу конспект по ооп для собеса. Не подскажете, а правильно ли будет озвучить ответ на вопрос о __new__ в таком виде:
    Магический метод __new__ неявно вызывается интерпретатором перед созданием экземпляра класса и возвращает ссылку по которой будет создан объект и далее при помощи конструктора __init__ примет необходимые свойства.

  • @DavidDavid-zm1kj
    @DavidDavid-zm1kj Год назад +2

    Все очень доходчиво, но неплохо бы про __call__ досказать... Интересно ведь! Спасибо!!!

    • @johnmazepa
      @johnmazepa 11 месяцев назад

      в уроке №12 досказывает))

  • @AS-th7xe
    @AS-th7xe Год назад +1

    можете посоветовать сайт/курс на степике с задачами по практике по ООП?

  • @antoxxxa154
    @antoxxxa154 Год назад

    __super__ !

  • @alexandrshoobenkov2163
    @alexandrshoobenkov2163 7 месяцев назад +1

    Примерно на 10 мин. 10 сек. в видео создается метод __del__ в котором значение __instanse вновь приравнивается к None. НО ведь в таком случае мы переопределяем метод __del__, и работать он просто не будет. Мы, как я понимаю, должны были строчкой ниже через super сослаться на нативный __del__ из старшего класса, от которого наследуемся. Или я что-то не понимаю? Спасибо!

  • @elenamalysheva5647
    @elenamalysheva5647 Год назад +1

    Голос похожий на Николя Дроздова из "Мира животных"

    • @GROMOZEKA_NZT
      @GROMOZEKA_NZT Год назад

      Ты сломал моё восприятие уроков этим комментом. Теперь мне всегда кажется, что меня обучает Николай Дроздов

  • @0ver4ance
    @0ver4ance Год назад +2

    @Сергей Балакирев, а зачем вообще нужно писать финализатор __del__? Ведь он вызывается тогда, когда объект попадает в сборщик мусора, но он никогда туда не попадет, так как атрибут __instance все ровно будет ссылаться на объект, следовательно и счетчик ссылок на объект никогда не будет равен нулю, если только мы вручную не переназначим __instance на другой объект

    • @selfedu_rus
      @selfedu_rus  Год назад +2

      он реально очень редко прописывается, только если что то нужно сделать с данными при удалении объекта

    • @antonivanov3830
      @antonivanov3830 9 месяцев назад +1

      @@selfedu_rus, а если без него все работает (я прогнал все то же самое без этого метода, результат тот же), для чего его здесь нужно было прописывать, возможно, есть какие-то примеры?

  • @impellergimpeller5133
    @impellergimpeller5133 2 года назад +1

    👍👍👍👍👍

  • @IvanDiiakonu
    @IvanDiiakonu 2 года назад +3

    Сергей добрый день !
    Спасибо за ваш курс!
    Подскажите пожалуйста, я столкнулся с вот такой ошибкой в конце данного занятия:
    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 года назад +1

      вы вместо init прописали int ))

    • @IvanDiiakonu
      @IvanDiiakonu 2 года назад +1

      @@selfedu_rus стыдоба....😨

    • @IvanDiiakonu
      @IvanDiiakonu 2 года назад +1

      ​@@selfedu_rus спасибо большое !)
      даже не понимаю как я такое мог пропустить - много раз перепроверял, а на это даже не обратил ни малейшего внимания.

  • @dedpihto680
    @dedpihto680 Год назад +1

    вот есть некий метод в некотором классе (готовая библиотека из интернета) . и мне нужно выполнить какието свои действия при вызове этого метода ну и потом запустить этот метод(уже из библиотеки) чтобы он свое отработал. но я даже не знаю где его искать и уж тем более как его дополнить чтобы он выполнил мои действия. подскажите плз

  • @Alichok59
    @Alichok59 Год назад +2

    Вот пример паттерна 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__)

  • @ms77grz
    @ms77grz Год назад

    👍👍

  • @rattlik1
    @rattlik1 2 года назад +3

    Спасибо, интересно. Подскажите, стоит ли читать Лутца, если уже обладаешь средними знаниями Python?

    • @selfedu_rus
      @selfedu_rus  2 года назад +2

      Не знаю, не читал ))

    • @rattlik1
      @rattlik1 2 года назад

      @@selfedu_rus :)

    • @user-bw4xg8tb9r
      @user-bw4xg8tb9r 2 года назад

      @@rattlik1 Я тоже таким вопрос задавался) В итоге просто пробежался по оглавлению Лутца. Прочитал пару глав незнакомых и понял, что в принципе можно и без прочтения этой книги обойтись. Но книга действительно неплохая, особенно понравилось, что в конце глав даётся список вопросов, а потом подробные ответы. Не знаю, может быть так во всех книгах сейчас, но например, когда я в школе учился, не видел ни одного учебника, чтобы после теоретических вопросов потом давались ответы на них

    • @rattlik1
      @rattlik1 2 года назад +1

      @@user-bw4xg8tb9r большое спасибо!

    • @andruhaz
      @andruhaz 2 года назад +4

      IMHO стоит, особенно по ООП (том2), он там так все подробно объясняет, и по нескольку раз. Книга сама дорогая, но можно раздобыть электронную версию. Даже если ты что-то знаешь никогда не лишне взглянуть с какого-то другого угла, многое заново узнаешь

  • @TheSSUnit
    @TheSSUnit Год назад +1

    возможно уже писали, но cls (1:13) ссылается на сам класс(не экземпляр класса, если я не путаю)

    • @selfedu_rus
      @selfedu_rus  Год назад +1

      В видео так и говорится, там только лишнее слово "экземпляр", нужно просто "класс". Но это из видео понятно совершенно четко.

  • @slava6566
    @slava6566 4 месяца назад +1

    как получаемые параметры *args и **kwargs методом __new__ передаются далее в __init__? ведь они из __new__ не передаются методу __new__ базового класса .. какой-то __new__ слишком магический метод))

  • @Archewar
    @Archewar Год назад +1

    у меня вскипают мозги, но я что то начинаю понимать в отличии от других роликов про ооп где я не понимал ничего

  • @obsi1019
    @obsi1019 Год назад

    топ

  • @dmitrystelmakhov848
    @dmitrystelmakhov848 2 года назад +1

    Приветствую! Этот курс будет аналогичен предыдущему по ООП? Не успел тот досмотреть.

    • @selfedu_rus
      @selfedu_rus  2 года назад +6

      Нет, этот больше и глубже

    • @dmitrystelmakhov848
      @dmitrystelmakhov848 2 года назад +1

      @@selfedu_rus Класс!) Отличный материал!

  • @Sergey-cz7ym
    @Sergey-cz7ym Год назад +1

    10:13 подскажите, а можно вместо названия класса (DataBase.__instance = None) указать какую-то переменную, типа cls или super, но тут сдс не подойдет так его нет в области видимости переменных этого метода а super относится к родительскому классу, просто немного похоже на хардкодинг...

    • @Sergey-cz7ym
      @Sergey-cz7ym Год назад

      Всё, можно не отвечать, ответ есть в следующем видео :)

  • @FreeUkraine4ever
    @FreeUkraine4ever 9 месяцев назад +1

    Получается магич метод __new выполняется сам автоматом при создании экземпляра класса?

  • @vlad161092
    @vlad161092 10 месяцев назад +1

    можешь, пожалуйста, прояснить, в контексте твоего примера: cls.__instance и DataBase.__instance = это тождественные понятия? Если да, то почему по-разному их пишем?

    • @selfedu_rus
      @selfedu_rus  10 месяцев назад +1

      Да, одно и то же. Только cls доступен не во всех методах, а только в классовых (есть еще статик и обычные). Если есть cls - это рекомендуемая практика. В других методах приходится для записи в атрибут класса использовать имя класса.

    • @vlad161092
      @vlad161092 10 месяцев назад +1

      @@selfedu_rus финализатор __del__, он насколько критичен? Я так понял, что его вводят только для того, чтобы память чистить для быстродействия системы. Типа, если не прописал __del__, ну и ладно, не очень критично для самого выполнения кода

    • @selfedu_rus
      @selfedu_rus  10 месяцев назад +1

      @@vlad161092 да, его редко используют, память чистить не нужно, т.к. Python (сборщик мусора) это делает автоматически

  • @user-qe5rf3wo6n
    @user-qe5rf3wo6n Год назад +1

    # Реализация 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

  • @SaVa_144
    @SaVa_144 9 месяцев назад

    Как я понимаю курс на степике жители других стран не могут приобрести?

  • @maxholon
    @maxholon 8 месяцев назад +1

    А правильно я понял, ято если в классе не определен метод __new__, то строка pt=Point(1,2) создает экземпляр класса Point, а если определен метод __new__ но в нем нет return, то новый экземпляр класса не создастся.

    • @selfedu_rus
      @selfedu_rus  8 месяцев назад +1

      Создается, только возвращаться не будет )) Ну и, фактически, сборщик мусора его сразу удалит ))

    • @maxholon
      @maxholon 8 месяцев назад

      @@selfedu_rus а может, подскажете, как оплатить на Степике этот курс из за границы?

    • @selfedu_rus
      @selfedu_rus  8 месяцев назад +1

      @@maxholon Напишите в ТГ-канал по Python, там попросите кого-либо оплатить, а вы уже ему.

  • @makooprime
    @makooprime Год назад +1

    Отличные уроки. Спасибо автору за труд. Но у меня остался вопрос почему в данном примере не работает финализатор __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, а значит, сборщик мусора не уничтожит объект в памяти. При создании нового, просто получите ссылку на уже существующий. Подробнее это можно спросить у сообщества телеграм-канала.

  • @richardplantagenet4095
    @richardplantagenet4095 28 дней назад

    А почему мы не можем просто вместо super() указать object? Ведь super просто - напросто возвращает аллокацию в памяти нашего базового класса object.
    P.S. Работает одинаково

  • @mvo5450
    @mvo5450 Год назад +1

    Здравствуйте. Скажите, а почему в этом методе def __new...
    If cls... is None, a не == None, например..?

    • @selfedu_rus
      @selfedu_rus  Год назад +2

      Так принято в Python делать проверку на None

    • @mvo5450
      @mvo5450 Год назад

      @@selfedu_rus , понял. Спасибо!

  • @user-dj4np3gg9y
    @user-dj4np3gg9y Год назад +1

    Красавчик

  • @user-pv6ut2uo3t
    @user-pv6ut2uo3t 2 года назад +1

    Здравствуйте! Подскажите, пожалуйста, как можно практиковаться по теме ООП? Нет ли задач, например как на stepic?

    • @selfedu_rus
      @selfedu_rus  2 года назад +10

      Создаю. Будут через месяц-два на степике

    • @user-pv6ut2uo3t
      @user-pv6ut2uo3t 2 года назад +1

      @@selfedu_rus Вот это отличные новости! Спасибо!

    • @user-zb4qi5fz4o
      @user-zb4qi5fz4o Год назад

      @@selfedu_rus Доброго времени суток. Когда примерно появится курс?)

    • @selfedu_rus
      @selfedu_rus  Год назад +1

      @@user-zb4qi5fz4o через месяц точно, возможно раньше, работаю

    • @user-zb4qi5fz4o
      @user-zb4qi5fz4o Год назад +1

      @@selfedu_rus спасибо, будем ждать)

  • @denisplotnikov6875
    @denisplotnikov6875 Год назад +1

    Все здорово, но у меня возник вопрос: на какой уровень (junior, middle) спрашивают данные вещи?

  • @user-qx2uw4qg1h
    @user-qx2uw4qg1h 2 года назад +1

    на сколько помню __instans нельзя изменить извне? потому что эта переменна закрыта __ вот такими подчеркиваниями?

    • @selfedu_rus
      @selfedu_rus  2 года назад

      да, так лучше, согласен

  • @kurtmiller77
    @kurtmiller77 2 года назад +2

    Отличное видео, теперь корректно удаляем. Я бы лишь добавил, что синглтон считается антипаттерном и его следует использовать с осторожностью. Но на таком уровне сложно донести почему это так.

  • @user-et2du5oz6j
    @user-et2du5oz6j 2 года назад

    Добрый день у меня вопрос, а зачем в принципе нужен __new__ если в прошлом уроке мы спокойно присваивали новые атрибуты с помощью метода __init__ в строке: "pt = Point(1,2)"

    • @selfedu_rus
      @selfedu_rus  2 года назад +1

      для более тонкого управления созданием объекта, например, паттерн Singleton без new не сделать

    • @eugenesemin4082
      @eugenesemin4082 2 года назад +6

      __init__ выполняется сразу после создания объекта - создался объект по такому-то адресу, выполнился __init__, который определил заданные в нем параметры.
      __new__ вызывается для создания экземпляра класса. По сути, он вызывается всегда из базового (или как еще называют - суперкласса (отсюда и метод super()) класса, при создании экземпляра какого-либо класса. Просто в данном уроке покзано переопределение этого метода внутри класса, чтобы произвести нужные манипуляции до создания его экземпляра.
      Т.е. если совсем крато __new__ создает новый экземпляр. __init__ работает с уже созданным с помощью __new__ экеземпляром.

  • @AzizjanAyupov_leo
    @AzizjanAyupov_leo 4 месяца назад +1

    так почему инит не сработал??

  • @Tragichorse
    @Tragichorse 11 месяцев назад +1

    Не очень понимаю один момент: создается впечатление, что с помощью __new__ экземпляр создается на базе класса object, а не Point. Или экземпляр автоматически прикрепляется к дочернему классу?

    • @selfedu_rus
      @selfedu_rus  11 месяцев назад

      На самом деле экземпляры создаются метаклассом type. Но это уже детали. Достаточно знать, что __new__ срабатывает непосредственно перед созданием объекта.

    • @Tragichorse
      @Tragichorse 11 месяцев назад

      @@selfedu_rus спасибо:>

  • @user-qv8gn1yq8t
    @user-qv8gn1yq8t 9 месяцев назад +1

    👀

  • @user-to8dm8tv4g
    @user-to8dm8tv4g 5 месяцев назад

    спасибо, все понятно. Единственное, как я не пытался так и не смог добиться вызова __del__, ссылка есть всегда и никогда не сбрасывается

    • @selfedu_rus
      @selfedu_rus  5 месяцев назад

      это непредсказуемое поведение, но он точно вызывается при удалении объекта из памяти (ее освобождения)

    • @user-de3op9hs4p
      @user-de3op9hs4p 5 месяцев назад

      Ссылки на объект класса не всегда явные, и обнаружить их вручную порой затруднительно. Надо пройтись по всем спискам, словарям и т.п. Может где-то объект сравнивается с чем-то. Иногда удаление всех ссылок на объект класса невозможно, пока код выполняется. При прекращении выполнения кода все ссылки удаляться и метод __del__ обязательно отработает. Но иногда это реально доставляет геморрой. Например, есть игра, ну скажем, классический сапёр. Я его написал с помощью pygame. Там есть возможность при проигрыше не запуская заново код, начать новую игру. Естественно, все данные из прошлой игры должны удалиться, что явно и делается. Но остаются неявные ссылки на объект класса Мины, например, которые если удалить, то игра не запуститься заново, вылетит исключение. Так вот, если долго играть, в конце этих объектов накапливается под тысячу, занимая память. Деструктор их не удаляет, так как ссылки на них нужны для правильной работы кода.

  • @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

  • @mao13132
    @mao13132 Год назад +1

    Почему в методе del не super а имя класса? При переименовании классов придётся вносить коррективы?

    • @selfedu_rus
      @selfedu_rus  Год назад

      super() - это обращение к базовому классу; здесь нам нужно менять атрибут текущего класса, поэтому прописывается его имя явно

    • @mao13132
      @mao13132 Год назад +1

      @@selfedu_rus спасибо за ответ. Как Вы тренируете мозг что он может осознать столько сложной информации? Изучаю Ваши труды - огромное спасибо

  • @mksmvnv
    @mksmvnv 7 месяцев назад +1

    у меня абсолютно так же код написан, но инит не вызывается(( в чем может быть косяк?
    вот код:
    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 4 месяца назад +2

      Может быть уже увидели, но у вас название функции __int__ а должно быть __init__ из-за этой опечатки и не работает.

  • @user-wq9dn9he8l
    @user-wq9dn9he8l 2 года назад +4

    Здравствуйте, очень понравился ваш урок, но есть небольшой вопросик. В методе __new__ для изминения значения __instance, Вы пишите cls.__instance, а в методе __del__ Вы пишите DataВase.__instance. В чем разница между этими двумя записями? Вроде как одно и тоже - все ссылается на класс DataBase... Или как?

    • @selfedu_rus
      @selfedu_rus  2 года назад +4

      в данном случае да, но лучше использовать cls, т.к. имя класса программист может изменить, а в коде забыть поменять

    • @user-wq9dn9he8l
      @user-wq9dn9he8l 2 года назад

      @@selfedu_rus Понял, спасибо!

    • @user-qv8gn1yq8t
      @user-qv8gn1yq8t 9 месяцев назад

      В методе __new__ cls ссылается на класс, поэтому для изменения значения __instance, пишут cls.__instance. У метода __del__ вместо cls self, а self ссылается на экземпляр класса, а не на сам класс как cls и поэтому, чтобы поменять атрибут класса (!не экземпляра класса) пишут (в нашем случае) DataBase.__instance, а не self. __instance.

    • @veahcen
      @veahcen 5 месяцев назад +1

      ​@@selfedu_rusа как тогда правильно изменять атрибут класса, если в метод передается только self, как в __init__ или __del__? Ведь через self создастся новая переменная у экземпляра с таким же именем, а не изменится атрибут класса. Использовать type(self)?

    • @selfedu_rus
      @selfedu_rus  5 месяцев назад +1

      @@veahcen либо прописывать имя класса перед атрибутом (вместо self), либо (и чаще всего) создается метод класса (classmethod) и у него вместо self идет cls - ссылка на сам класс

  • @vb52ru
    @vb52ru 2 года назад +4

    Не понял что изменилось, вроде тот же урок

    • @selfedu_rus
      @selfedu_rus  2 года назад +1

      Была ошибка при реализации паттерна Singleton, поправил

  • @random_act
    @random_act 7 месяцев назад +1

    блеск

  • @void7573
    @void7573 2 года назад +2

    Магия и бесовщина этот ваш питон. Но спасибо за разъяснения!

  • @origami5334
    @origami5334 Год назад

    Чуть не понял,в определении __new__ указывается что он создается перед самим объектом класса,но как ты тогда в него переменную instance вводишь,если new создается до всего,еще ты вроде не уточнил что блок __new__ начинает работать именно в экземплярах класса,как по мне это не очень очевидно.

    • @selfedu_rus
      @selfedu_rus  Год назад

      1. cls.__instance - это обращение к атрибуту класса, а не создаваемого экземпляра, т.к. экземпляра еще нет.
      2. метод new выполняется как классовый метод, а не метод экземпляра.

    • @origami5334
      @origami5334 Год назад

      @@selfedu_rus Ты чуть не правильно меня понял,ты упоминал что перед созданием каласа вызывается __new__ то есть класса и его переменных не существует,то как тогда ты в эту функцию __new__ передаешь instance ,ведь это переменная класса

    • @selfedu_rus
      @selfedu_rus  Год назад

      @@origami5334 перед созданием экземпляра класса, если сказал просто класса, то оговорился