PYTHON MAGIC METHODS. __INIT__ и __NEW__

preview_player
Показать описание
Всем привет! Продолжаю тему магических методов в Python. На очереди методы __init__ и __new__.

Поддержать:

#ityoutubers #ityoutubersru
Рекомендации по теме
Комментарии
Автор

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

Army_of_Earth
Автор

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

vladimirkulakov
Автор

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

leoapril
Автор

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

gopherDooshit
Автор

Спасибо, но я бы еще добавил про __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 - неймспейс к нему.

andreykuskov
Автор

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

lekerrka
Автор

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

nucqtoz
Автор

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

empty
Автор

Думаю, было бы еще глубже, если бы показать, как создать "болванку" - сиречь экземпляр, какого ни будь другого класса, определенного выше.
Например, яйцо создает либо курицу, либо питуха:
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())

pavelkalinin
Автор

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

MikhailTsarev
Автор

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

fdgydio
Автор

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

szwehcr
Автор

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

sasha_
Автор

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

gffrqwe
Автор

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

hopelesssuprem
Автор

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

yabarm
Автор

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

maksimluzin
Автор

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

MrLotrus
Автор

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

nickyr