PYTHON MAGIC METHODS. __INIT__ и __NEW__

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ก.ย. 2024
  • Всем привет! Продолжаю тему магических методов в Python. На очереди методы _init_ и __new__.
    Поддержать:
    / luchanos
    / @luchanos
    #ityoutubers #ityoutubersru

ความคิดเห็น • 32

  • @leoapril
    @leoapril ปีที่แล้ว +1

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

  • @АндрейСаєнко-н5з
    @АндрейСаєнко-н5з 5 หลายเดือนก่อน

    спасибо

  • @lekerrka
    @lekerrka ปีที่แล้ว

    Все очень понятно и грамотно описано, до сердечка достучаться удалось ❤️

  • @alpachina1
    @alpachina1 2 ปีที่แล้ว

    Благодарю, все понятно!

  • @Army_of_Earth
    @Army_of_Earth 2 ปีที่แล้ว +9

    О данных конструкторах знал, но не знал, что в ___new___ аллоцируется память. Спасибо!
    Это не относится прямо к теме ролика, но добавлю, что в отличие от "магического" *this* в других языках, *self* - это просто переменная, в которую передается ссылка на экземпляр. Например, название можно изменить на любое другое, а поведение не изменится. Менять название, разумеется, нет смысла, но понимать природу первого параметра метода, уверен, не помешает.

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      Всё верно! Аналогичная картина с переменной cls в классметодах)

  • @DenisSudakov
    @DenisSudakov 2 ปีที่แล้ว +1

    Добрый вечер.
    Все понятно описано. Тем кто никогда не сталкивался с ООП прям топчик. Про метод __new__ не знал, закину в копилочку)

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      спасибо!)

  • @andreykuskov8807
    @andreykuskov8807 2 ปีที่แล้ว +2

    Спасибо, но я бы еще добавил про __dict__, тогда бы, возможно, у зрителя сложилась бы лучше картина по отличиям между инстансом и классом. Либо даже отдельно было бы неплохо рассказать про неймспейсы.
    class Program:
    language = 'Python'
    def say_hello():
    print(f'Hello from {Program.language}!')
    print(Program.__dict__)
    print(python.__dict__)
    По такому простому коду можно понять, как инстанс, не имея в неймспейсе ничего, может ходить к классу и заимствовать у него атрибуты:
    python = Program()
    Но при этом будет спотыкаться о методы, в которых self не передается, что опять же нас возвращает к неймспейсам. Да и вообще раскрывает суть метода в связке с объектом в отличии от функции...
    К чему я это все?
    Получается, что new - создает объект, а init - неймспейс к нему.

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      звучит разумно! я думаю что для новичков это сложно осознать, но для углубленного разбора идея хорошая

  • @ТимурБелянин-й3ф
    @ТимурБелянин-й3ф ปีที่แล้ว

    Большое спасибо за видео! Только у вас понял в чем суть работы __new__

  • @sasha_295
    @sasha_295 2 หลายเดือนก่อน

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

  • @djangodev3191
    @djangodev3191 2 ปีที่แล้ว

    Лайк

  • @hopelesssuprem1867
    @hopelesssuprem1867 2 ปีที่แล้ว

    спасибо за видос, очень классно, только еще бы задачек закинуть для практики - ваще было бы супер. Такой вопрос: когда примерно выйдет курс? С удовольствием посмотрю в нем продвинутые темы))

  • @yabarm
    @yabarm 2 ปีที่แล้ว +1

    Понятное видео. На практике что в нью прописывается? Хочется на примерах понять его надобность

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      спасибо!) да, через переопределение new реализуется паттерн singletone

  • @MrLotrus
    @MrLotrus 2 ปีที่แล้ว

    Спасибо. Я только не понял зачем ты в ___new___ указал принимать *args, **kwargs.
    И каким образом переданные аргументы через ___new___ прокидываются в ___init___

  • @nickyr42
    @nickyr42 2 ปีที่แล้ว

    прикрепите пжлста ссылку на прошлый ролик, о котором упомянаете в записи?

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      про магические методы?

  • @adammagomedov9822
    @adammagomedov9822 7 หลายเดือนก่อน

    Ничо не понял

  • @vladimirkulakov6126
    @vladimirkulakov6126 2 ปีที่แล้ว +8

    Понятно и доходчиво, спасибо тебе! Работай над курсом!

    • @luchanos
      @luchanos  2 ปีที่แล้ว

      Спасибо большое!) Я уже)

  • @ХалилМаденбай
    @ХалилМаденбай 2 ปีที่แล้ว +2

    в купе с каналом Python russia что то доходит

  • @pavelkalinin1119
    @pavelkalinin1119 ปีที่แล้ว

    Думаю, было бы еще глубже, если бы показать, как создать "болванку" - сиречь экземпляр, какого ни будь другого класса, определенного выше.
    Например, яйцо создает либо курицу, либо питуха:
    from random import randint
    class Chicken:
    pass
    class Cock:
    pass
    class Egg:
    def __new__(cls, *args, **kwargs):
    return super().__new__(Chicken) if randint(1,10) % 2 else super().__new__(Cock)
    print(Egg())
    print(Egg())
    print(Egg())
    print(Egg())

  • @gopherDooshit1
    @gopherDooshit1 ปีที่แล้ว +3

    вот реально иногда нужно, чтобы преподаватель не за 2 минуты пробежал тему __new__ , а размазал тонким слоем на 15 минут. Спасибо вам больше, наконец стал лучше понимать

    • @luchanos
      @luchanos  ปีที่แล้ว +1

      всегда рад))

  • @romanbush5164
    @romanbush5164 2 ปีที่แล้ว +1

    Класс не знал про New

  • @maksimluzin1121
    @maksimluzin1121 ปีที่แล้ว

    Ну, формально говоря, конструктор в других языках ООП (С++, например) _тоже_ не "аллоцирует" экземпляр класса (объект) в памяти, а инициализирует его, хотя может и "раскидать"/"собрать" объект из других объектов внутри своего кода. Точнее, и более правильно говоря, _перед_ вызовом конструктора вызывается _встроенный_ метод (даже функция), которая выделяет "кусок" памяти по структуре/описанию класса, а потом уже вызывается конструктор, которому передаётся адрес этого "куска памяти"... Так что в Python'е, формально, происходит почти то же самое, только в более _явном_ виде! Сначала __new__ , который является аналогом встроенной функции в С++, а потом уже __init__ , который является аналогом конструктора (инициализатора) в С++... В общем, "те же я**а - только в профиль!" 😉

  • @MikhailTsarev
    @MikhailTsarev 2 ปีที่แล้ว

    Хороший ролик! Большое спасибо. Для "идеального" не хватило объяснения, что залетает под видом cls в __new__ (видимо, object или type...) и зачем переопределять __new___ на практике.

  • @аквариумкарася
    @аквариумкарася 2 ปีที่แล้ว

    Спасибо, спустя 2 дня я выкупил прикол этого маг. метода

  • @empty9228
    @empty9228 2 ปีที่แล้ว

    Николай, спасибо! У тебя хорошая подача материала)

  • @NICKstyle
    @NICKstyle 2 ปีที่แล้ว

    Всё подробно и понятно. Респект)