Инвариантность, ковариантность и контравариантность на примере Python

Поговорим о насущном! Инвариантность, ковариантность и контравариантность на примере Python:)
0:00 Вариантность
3:01 Иерархия классов
5:06 Ковариантность
7:05 Инвариантность
10:32 Контравариантность
15:21 Резюме
Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб:
botanim.to.digital/
botanim_to_digital_bot.t.me/
Telegram - t.me/t0digital
ВК - digitalize.team
RuTube - rutube.ru/channel/24802975/ab...
Дзен - dzen.ru/id/6235d32cb64df01e6e...

Пікірлер: 95

  • @user-jr3iv3ny9c
    @user-jr3iv3ny9c Жыл бұрын

    Браво, Алексей! Так филигранно завуалировать под видео о вариантности мысль что фронтэндеры не программисты - это достойно))) Шутка!

  • @bukanaka

    @bukanaka

    Жыл бұрын

    Ах ты ж бэкендер😂

  • @KoichiHub

    @KoichiHub

    Жыл бұрын

    При чем через ошибку, что программисты не фронтендеры

  • @alexdzehil7194
    @alexdzehil7194 Жыл бұрын

    Как Александр люто плюсую за алгоритм начисления зарплаты🤣

  • @P7Vagrant
    @P7Vagrant Жыл бұрын

    Я для простоты понимания зафиксировал себе так: 1. Инвариантность - стоим на месте (для ассоциации - на линии, inline). То есть указываем тип в коде и дальше этого типа никуда не можем двигаться. Представляем иерархию типа и мы на одной из точек, стоим на одной линии. 2. Ковариантность - можем двигаться по типам вниз по иерархии (Кова... - можно ассоциировать с Копать). 3. Контрвариантность - Двигаемся по типам вверх, к родителям типа (ассоциация - Контр, то есть противоположность, то есть как копать, только наоборот 😊). Возможно кому-то будет полезна такая заметка. P.S.: Спасибо за видео! Очень познавательно и доступно!

  • @chu_ri5470

    @chu_ri5470

    11 ай бұрын

    Дополнение. Инвариантность не обязательно должна быть типовая. То есть, если у тебя есть переменная месяцДляОтпуска, то её значение не может быть отрицательным или 123. Только [0..12] Даже если речь о инте. Иначе лучше её как то переименовать и дополнительно пояснить. Более того попытка все типы обернуть в классы/enum/синтаксис приведёт вас к более страшным последствиям. Особенно в Питоне из-за не самой удобной работы с интерфейсами и наследованием.

  • @filippov_es
    @filippov_es Жыл бұрын

    Какая прелесть! Очень интересно, спасибо большое!

  • @valk9819
    @valk9819 Жыл бұрын

    Круто, все четко без воды и с примерами. На пальцах показал за что лайк и питонячее спасибо.

  • @OlViktorovich
    @OlViktorovich Жыл бұрын

    Прям актуально, типизация страшная сила ... Спасибо

  • @d1z3ro
    @d1z3ro Жыл бұрын

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

  • @t0digital

    @t0digital

    Жыл бұрын

    Спасибооо!

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Жыл бұрын

    Спасибо за видео!

  • @lukasmog777
    @lukasmog7774 ай бұрын

    Спасибо за видос. Сидел читал википедию и какие-то статьи и была каша в голове была. После видоса сразу все встало на места.

  • @alittlemoron4068
    @alittlemoron4068 Жыл бұрын

    Очень полезное видео. Вообще, я знал про все эти делегаты, контейнеры, но не представлял, что в питоне, таком необязательном для типизации языке, оно используется, и столкнулся с этим сразу на Generic'ах в TypeVar. Было очень послушать эту тему именно на примере питона

  • @Keriokutori
    @Keriokutori Жыл бұрын

    контравариантность - это когда программист делает задачу, которую должен делать сотрудник. Как же это знакомо)))

  • @oguretsagressive

    @oguretsagressive

    Ай бұрын

    Это контрпродуктивность 😁

  • @moowmotors
    @moowmotors Жыл бұрын

    ТОП!

  • @samvelsafaryan4698
    @samvelsafaryan4698 Жыл бұрын

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

  • @maksimkuznetsov2132
    @maksimkuznetsov213215 күн бұрын

    Привет, сидел на работе. Все было неплохо. И тут попалось это видео, и меня на середине вырубило. Очнулся через пару часов

  • @t0digital

    @t0digital

    15 күн бұрын

    Что может быть лучше здорового послеобеденного сна!

  • @MadMike93
    @MadMike93 Жыл бұрын

    на предыдущей работе в тайп хинтах ковариативность использовали в модуле который конфиги грузил разных классов в зависимости от переменной окружения ENVIRONMENT))) ну тип был базовый класс и куча дочек local, dev, testing, test, stage prod)))

  • @Maniakalochka
    @Maniakalochka Жыл бұрын

    Ничегошеньки не понял, но очень интересно)) Отложу видео на потом, сейчас не хватает знаний

  • @uicodeuz
    @uicodeuz Жыл бұрын

    Кайф

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Жыл бұрын

    Этак, неявное преобразование типов для ссылок на иммутабельные структуры не работает… а если будет неконстант, также инвариант по ссылкам сохранится?..

  • @jamjam3337
    @jamjam3337 Жыл бұрын

    👏

  • @TheDeatgod
    @TheDeatgod Жыл бұрын

    Если в примере с инвариантностью я сделаю programmers_list = frontenders_list.copy(), то при добавлении элементов в любой из списков результат операции не отразится на втором списке. Очевидно, что frontenders_list и frontenders_list.copy() имеют один и тот же тип.

  • @user-cw3ui3je5g
    @user-cw3ui3je5g Жыл бұрын

    Браво. Топ канал.

  • @MrNagios
    @MrNagios Жыл бұрын

    Good evening Ozzy

  • @sad0FFsky
    @sad0FFsky Жыл бұрын

    Алексей, как попасть к вам на курс?когда он стартует?

  • @t0digital

    @t0digital

    Жыл бұрын

    Курс ещё не запущен. Подпишитесь на телеграм, там будет вся информация t.me/t0digital

  • @sad0FFsky

    @sad0FFsky

    Жыл бұрын

    @@t0digital а примерные сроки запуска известны?

  • @VGCor
    @VGCor Жыл бұрын

    Типизация непростая тема. Никак не врублюсь почему типы раскиданы по модулям разным, когда есть вроде специальный typing. Нужен тебе какой, то по всему питону ищи... Тему видоса вообще понял только к резьюме 15:50 😂

  • @JillOverlord
    @JillOverlord Жыл бұрын

    Пример для инвариантности заставил удивиться. Пальцы всегда сами бьют "from typing import List"... :)

  • @DES2048
    @DES20489 ай бұрын

    Если очень простыми словами: Инвариантность - можно присвоить именно тот тип, который указан Ковариантность - тип и его потомков Контрвариантность - тип его и предков

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Жыл бұрын

    А как же тензорный анализ🤪?..

  • @Skeap11
    @Skeap11 Жыл бұрын

    Возможно я не въехал, но кажется, что пример про контравариативность некорректный т.к. аннотация аргументов функция работает ковариативно т.к. task_for_employee принимает Employee и его наследников.

  • @user-vc2nf9cv8b

    @user-vc2nf9cv8b

    9 ай бұрын

    тоже думаю об этом и ломаю голову........

  • @oguretsagressive

    @oguretsagressive

    Ай бұрын

    Все-таки корректный, просто здесь только аргумент "task" контравариантный (подходят функции со всем что выше по иерархии). Аргументы для "task_for_*" ковариантные ("Programmer" и ниже по иерархии).

  • @guiterenzog2723
    @guiterenzog2723 Жыл бұрын

    Если честно, из-за частого повторения запутался. Что я понял: - инвариантность - про то, что в списки (сюда же кортежи) конкретного типа можно помещать объекты только этого типа (наследников нельзя) - ковариантность - про то, что последовательность конкретного типа может содержать объекты как этого типа, так и его наследников - контрвариантность - про то, что можно использовать сущность, предназначенную для конкретного типа, всеми родителями этого типа Корректно?

  • @t0digital

    @t0digital

    Жыл бұрын

    Списки, последовательности и прочее - это конкретные типы, а понятия инвариантности, ковариантности и контравариантности (вероятно в видео я несколько неправильно называл последние два) - абстрактные, то есть не привязаны к конкретным типам вроде листа или последовательности. Про что эти понятия. Вот есть класс Parent и есть его подтип Child, то есть Child определён как class Child(Parent). Понятия инвариантности, ковариантности и контравариантности про то, как более сложные типы, построенные из Parent и Child, относятся к этому наследованию Child от Parent. Более сложные типы это, например, последовательности, списки, Callable и пр. Ковариантность - более сложные типы наследуются в том же порядке, что и сами классы. Например, Sequence[Child] является подтипом Sequence[Parent]. Туда, где ожидается Sequence[Parent], можно передать Sequence[Child]. В обратную сторону это не работает. Инвариантность - более сложные типы никак не относятся к наследованию начальных типов. Нельзя идти ни вверх, ни вниз по иерархии. Например, list[Child] не является подтипом list[Parent], и list[Parent] не является подтипом list[Child]. Туда, где ожидается list[Parent], можно передать только list[Parent], а туда, где ожидается list[Child], можно передать только list[Child]. Контравариантность - более сложные типы наследуются в обратном порядке. Например, Callable[[Parent], None] является подтипом Callable[[Child], None]. Туда, где ожидается Callable[[Child], None], можно передать Callable[[Parent], None]. В обратную сторону это не работает.

  • @guiterenzog2723

    @guiterenzog2723

    Жыл бұрын

    @@t0digital отличное объяснение, спасибо!

  • @user-qs4fv5ui5j
    @user-qs4fv5ui5j7 ай бұрын

    Разве инвариантность и контрвариантность не противоречат принципу подстановки Лисков?

  • @t0digital

    @t0digital

    7 ай бұрын

    Неа. Если интересна тема, задайте вопрос конкретнее

  • @user-qs4fv5ui5j

    @user-qs4fv5ui5j

    7 ай бұрын

    @@t0digital ну вот такое видел: Этот принцип говорит нам о том, что если класс Sub является подтипом класса Sup, тогда в программе объекты типа Sup должны легко заменяться объектами типа Sub без необходимости изменения кода. А Инвариантность нам по сути не дает подставлять дочерние подтипы

  • @oguretsagressive

    @oguretsagressive

    Ай бұрын

    @@user-qs4fv5ui5j в mutability дело. Если контейнер изменяемый, то происходит две подстановки - по принципу Лисков и в противоположную сторону. Переменные двух разных типов ссылаются на один контейнер. Поэтому если в переменную с более общим типом (Employee) добавим еще одного Employee, он появится и в переменной с более частным типом (Programmer), кто-то заставит этого Employee написать код - и опаньки.

  • @stanislavkovalev2783
    @stanislavkovalev2783 Жыл бұрын

    Не петь, а пить )

  • @t0digital

    @t0digital

    Жыл бұрын

    Возмоооожно:)

  • @furrygem5176
    @furrygem5176 Жыл бұрын

    7:55 я думал он скажет "фронтендер не программист"

  • @Max-nr1bv
    @Max-nr1bv Жыл бұрын

    Есть какая литература по теме?

  • @t0digital

    @t0digital

    Жыл бұрын

    Об этом есть в «Python к вершинам мастерства», Лусиану Рамальо, 2 издание. Мы сейчас читаем ее в Ботаним

  • @KoichiHub
    @KoichiHub Жыл бұрын

    В TypeScript проще работать с типами, чем в Python. Да и книжечка по тоньше - 'Профессиональный TypeScript' от Черного Бори

  • @t0digital

    @t0digital

    Жыл бұрын

    Да, TS лучше работает с типами

  • @stanislavserov8622
    @stanislavserov8622 Жыл бұрын

    Привет! Прошу снять что-то русскоязычное по Flet.

  • @t0digital

    @t0digital

    Жыл бұрын

    про это? flet.dev/

  • @stanislavserov8622

    @stanislavserov8622

    Жыл бұрын

    @@t0digital да

  • @stanislavserov8622

    @stanislavserov8622

    Жыл бұрын

    @@t0digital там они в документации написали что до конца года планируют сделать нечто expo, как для react, то есть что-то будет прям на мобилке просматриваться во время разработки и тд.

  • @t0digital

    @t0digital

    Жыл бұрын

    @@stanislavserov8622 не пользовался такой штукой и от мобильной разработки сейчас далек. Пожалуй, писал бы на Дарте напрямую на флатер, если бы занимался мобильной разработкой

  • @stanislavserov8622

    @stanislavserov8622

    Жыл бұрын

    @@t0digital а по django unicorn можете что-то сказать? только сегодня узнал про это.. в рунете мало инфы

  • @user-pw6wo3se1n
    @user-pw6wo3se1n Жыл бұрын

    Ребятки! Меня всегда поражают "сюсюканье" и "щенячий восторг" многих "клепающих" свои комментарии, направленные в адрес автора того или иного видео, вне зависимости от того, на сколько доступно удалось автору объяснить рассматриваемые детали темы, а также, - вне зависимости от того, что полезного осталось в черепушках слушателей лекции, после ее окончания. Все это напоминает мне, - не то быль, не то анекдотическую байку о лекции офицера радиотехнически войск противовоздушной обороны в "сержантской учебке" подготавливающей специалистов- операторов РЛС (Радио-локационных станций) из числа солдат-призовников, вот только что принявших воискую присягу. Преподаватель, - капитан, вот уже третий день под ряд билсяся как та рыба об лед, пытаясь обяснить вчерашним школьным "троечникам", - что собой представляют: электрический заряд, поле заряда, потенциал, напряжение как разность потенциалов, электродвижущая сила (эдс), постоянный и переменный токи, электрические цепи, синусоидальная форма переменного тока, его частота, амплитуда, период, фазовые сдвиги, активные и реактивные сопротивления, электрические импульсы и их формы, ёмкость и индуктивность, добротность катушек индуктивности, электромагнитные волны - стоячие, бегущие и отраженные, линии с распределенными параметрами, а также, многое-многое другое, что эти "недоросли" должны бы усвоить еще в школе.А вот сейчас должны будут хотя бы немножко соображать, - обслуживая довольно-таки сложную и дорогостоящую технику, - как с ней работать, как проводить профилактические регламентные работы, как настраивать ее, и при этом еще и выявлять незначительные сбои в ее работе.. Окончив очередную лекцию на тему приемо-передающих антенн, капитан, глядя в абсолютно по-детски чистые, словно у младенцев, глаза слушателей, как и в конце предыдущих занятий произнёс одну и ту же фразу: "Вопросы будут? В ответ последовало гробовое молчание,... Но тут, - о чудо, из задних рядов поднялась чья-то рука - "Разрешите товарищ капитан? Тут абсолютно все понятно, вот только один вопрос, - непонятно, как такая большая амплитуда электрического тока в такой тоненький проводочек помещается?" Было ли это или нет.... Издевался ли придуриваясь, этот "салажонок" над капитаном или же действително был полным дебилом, - история умалчивает... Но вот мне кажется, судя по комментариям, что большинство так и не поняло, что это за термины такие мудреные: "Инвариантность", "Ковариантность" и "Контравариантность", - для чего они, и "с чем их едят"... А всего лишь из-за нечетко сформулированной автором этого видео, задачи по решению проблем с этими тремя факторами или понятиями, (считайте, как хотите). В общем, - все три эти понятия первоначально были приняты в математике. Затем постепенно перекочевали сначала в физику, а затем и в программирование,- как производную отрасль математических вычислений. Я бы к примеру, не использовал бы довольно аморфный пример с профессиональной деятельностью сотрудников. На мой взгляд, здесь гораздо сложнее увязывать понятия "сотрудник" с профессиями и специализациями штата работающих. Попытка привязать эти определения к листингам отдельных кусков программы, - для слушателей-новичков абсолютно ничего не говорит. А вот, если бы в дискуссию ввязались еще и программисты, - то тогда бы скорее всего, - лекция вообще бы переросла в длительный спор профессионалов о "правильности" и "неправильности" написания "кода" а для новичков это бы превратилось в продолжительное и абсолютно напрасное времяпровождение. Я вообще-то, как ветхий старик, - абсолютно не признаю это свободную "эквилибристику" из уже ранее принятыми понятиями и терминами. Под термином "код" - я понимаю кодироваеие в системах исчисления: двоичной, двоично-десятичной, восьмиричной и остальных, а также, - "кодирование" - как синоним шифрования. Все остальное для меня, - это исключительно программирование с листингами программ и блок-схемами определяющими различные алгоритмы, на сколько бы не усложнялись в настоящее время языки программирования... Хотя, я могу в чем-то и ошибаться, однако игра слов, определяющая тот или иной термин, на мой взгляд, только создает путаницу, ибо мне уже довелось в этих новых "сленгах" встречать англоязычные термины, заменившие другие, прежние старые, с абсолютно таким же названиями. А сейчас вернусь к теме определения и пояснения трех приведенных выше понятий. Я бы, к примеру, в подобной лекции прибег бы к задаче создания небольшой, даже элементарной, поисково-справочной базы данных с использованием библиотеки (в прямом смысле этого слова), состоящей из книг-учебных пособий (в цифровом формате) с классификацией этих книг по авторам, по жанрам в области вычислительной техники, по языкам программирования, по темам, оглавлениям, по отдельным определениям того или иного понятия и т.д. Попытки написания небольших листингов программ с постановкой членораздельной задачи по поиску той или другой темы в указанных книгах могли бы достаточно доходчиво и убедительно объяснить суть видеолекции. А так, по примитивным комментариям и не удалось узнать, принес ли указанный видеоурок хоть какую нибудь реальную помощь для обучающихся? Тем более, что в Интернете довольно кратко и доходчиво приведены определения всех трех терминов.

  • @t0digital

    @t0digital

    Жыл бұрын

    Спасибо за комментарий! Рекомендую разбивать текст на небольшие осмысленные абзацы - вероятность того, что кто-то их прочтёт, будет значительно выше.

  • @user-pw6wo3se1n

    @user-pw6wo3se1n

    Жыл бұрын

    @@t0digital Учту. Но согласитесь, что та Ваша лекция была не совсем удачной.

  • @t0digital

    @t0digital

    Жыл бұрын

    @@user-pw6wo3se1n нет, не соглашусь

  • @user-pw6wo3se1n

    @user-pw6wo3se1n

    Жыл бұрын

    @@t0digital Ну что же... Здесь может быть лишь один вывод: Что я гораздо глупее вас. А если, к тому же, окажется в действительности, что многие ваши слушатели и зрители реально, а не на словах, поняли вашу трактовку упомянутых терминов и им это поможет в дальнейшем, то мне остается только порадоваться ростками молодых талантов в зарослях нынешнего, почти сплошного невежества. Просто я привык гораздо сильнее "разжевавать" подаваемый материал, раз я за него взялся, и пытаться его преподать, как говорится, "на пальцах". Я у Вас это больше напоминало лекции Тимофея Хирьянова для студентов МФТИ.

  • @oguretsagressive

    @oguretsagressive

    Ай бұрын

    Осилил оба коммента, понял смысл слова "разжевывать" - усложнить, запутать, добавить воды, канцеляризмов и опечаток (или слов-паразитов, если лекция устная). Чтобы тот, кто изначально не понимал тему, не понял и в конце. Помню в универе самые "разжеванные" материалы как раз этими свойствами и отличались.

  • @proofit404
    @proofit404 Жыл бұрын

    Даже в примерах кода бэкендеры самые обделённые в зарплате WTF

  • @user-rw6vm5bs5g
    @user-rw6vm5bs5g Жыл бұрын

    На руках паныряй!))))) Спалено ;-)

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t Жыл бұрын

    А может ли более узкая специализация класса вызывать перегруженное поведение базового класса? Что-то вроде виртуальных функций или имплементации интерфейсов?..

  • @t0digital

    @t0digital

    Жыл бұрын

    Не понял вопрос, к сожалению:)

  • @user-pg8ry1tm3t

    @user-pg8ry1tm3t

    Жыл бұрын

    @@t0digital просто есть ли какой механизм динамического или иного полиморфизма в питоне?)

  • @megaman13able

    @megaman13able

    Жыл бұрын

    @@user-pg8ry1tm3t кажется для этого есть оператор super

  • @mark_parker

    @mark_parker

    4 ай бұрын

    @@user-pg8ry1tm3t super()

  • @maybejke
    @maybejke Жыл бұрын

    все видео намеки на этих фронтеендеров, не программеров xDDD

  • @banzaika
    @banzaika Жыл бұрын

    Качество хорошеет, но долго

  • @aleksandrdevelopment3321
    @aleksandrdevelopment3321 Жыл бұрын

    Все очень круто) но откажись уже от пайтона)))

  • @t0digital

    @t0digital

    Жыл бұрын

    В пользу чего:)?

  • @aleksandrdevelopment3321

    @aleksandrdevelopment3321

    Жыл бұрын

    @@t0digital C#/Java а если уж хочешь быть программистом то С++ %)

  • @oguretsagressive

    @oguretsagressive

    Ай бұрын

    @@aleksandrdevelopment3321 и что собираешься писать на C++?

  • @alexs8582
    @alexs8582 Жыл бұрын

    Почему пайтон, если питон?

  • @t0digital

    @t0digital

    Жыл бұрын

    Нэт, пайтон) язык назван в честь Монти Пайтон

  • @alexs8582

    @alexs8582

    Жыл бұрын

    @@t0digital Понятно, "программисты бывают двух типов - те которые говорят питон и те кто программирует"))

  • @t0digital

    @t0digital

    Жыл бұрын

    @@alexs8582 да я не особо обращаю внимание на это:) мое произношение английских слов в любом случае так себе

  • @heisenberg6874
    @heisenberg6874 Жыл бұрын

    чувак работающий в компании с именем ян😊😊😊

  • @t0digital

    @t0digital

    Жыл бұрын

    Бедолага😂

  • @user-kw4kp7eq9m
    @user-kw4kp7eq9m Жыл бұрын

    Я правильно понял, что в Питоне: Sequence - ковариантные, списки - инвариантные, а функции - контрвариантные?

  • @t0digital

    @t0digital

    Жыл бұрын

    Sequence это неизменяемая структура, поэтому она ковариантна по отношению к типам данных в ней. Списки инвариантны по отношению к типам в структуре. Функции (Callable, там могут быть вызываемые объекты тоже, не только функции) ковариантны по возвращаемому значению (об этом не было в видео, но это так) и контраварианты по аргументам

  • @avpmk
    @avpmk Жыл бұрын

    Правильно говорить: "ковариантность" и "контравариантность". Вариантность, не вариативность.

  • @t0digital

    @t0digital

    Жыл бұрын

    Да

  • @zxw
    @zxw Жыл бұрын

    Понятнее к сожалению не стало😢

  • @jamuelsexon
    @jamuelsexon Жыл бұрын

    Уснул. Скучно.

  • @t0digital

    @t0digital

    Жыл бұрын

    Приятных снов!

  • @dogbusiness5201
    @dogbusiness52017 ай бұрын

    Спасибо за видео!

Келесі