LINUX.ORG.RU

Вопрос по наследованию в питоне

 ,


1

3

Давно хотел поинтересоваться. Много слышал, что в питоне все методы лексически связаны с объектами, в которых они определены. Сейчас в JS введены функции, которые имеют такие же ограничения, поэтому, это можно проиллюстрировать таким вот кодом

Object.prototype.foo = () => console.log(this.a)

o = {a: 1}
o.foo() // undefined

Мне не совсем понятно, как же в питоне тогда организуется наследование делегированием, если там нет динамического связывания? Как строятся сабклассы? Что, все копируется чтоли? Каждый сабкласс содержит в себе все экземпляры предков?

Питон же называют «динамическим» языком обычно. В каком смысле тут употребляется слово динамический? Получается, что не в том смысле, что в нем есть динамическая диспетчеризация, а в том смысле, что там динамическая типизация? Это же, по сути подмена понятий, не? Все смешалось в одну кучу.

И еще вопрос. Как при такой модели питону удается избежать оверхеда по памяти? По идее, он же должен отжирать не меньше Java или Хаскеля при такой модели? Или есть какие-то секреты? Как там все работает изнутри?



Последнее исправление: ymn (всего исправлений: 1)

Ответ на: комментарий от vurdalak

Опять написал фразу «опять выходишь на связь?»?

somequest
() автор топика

Что, все копируется чтоли? Каждый сабкласс содержит в себе все экземпляры предков?

ОСПАДЕТЫБОЖЕМОЙ! Забота об оптимизации!

i-rinat ★★★★★
()

Python должен отжирать не меньше Java

Ahahaha, oh wow.

Mahmood
()

Class attribute references are translated to lookups in this dictionary, e.g., C.x is translated to C.__dict__[«x»] (although there are a number of hooks which allow for other means of locating attributes). When the attribute name is not found there, the attribute search continues in the base classes. This search of the base classes uses the C3 method resolution order which behaves correctly even in the presence of ‘diamond’ inheritance structures where there are multiple inheritance paths leading back to a common ancestor.

Deleted
()
Ответ на: комментарий от i-rinat

Тут как бы не только оптимизация, хотя и она тоже. Еще не понятно, как при такой модели работают метаобъекты. Скажем, Я меняю в рантайме одно из полей, а в одном из сабклассов есть метод, который использует это поле. Как при этом сделать так, чтобы изменения применились ко всем наследникам, если каждый из них лезет в свою собственную копию, грубо говоря? Надо где то содержать таблицу, и все перезаписывать при любом изменении, или как?

somequest
() автор топика
Ответ на: комментарий от i-rinat

Не. А при чем тут они? си — это вообще не ООП? А плюсы — вроде, чисто компилируемый, его никто «динамическим» не называет.

somequest
() автор топика
Ответ на: комментарий от somequest

Не.

Тогда прими как факт то, что понять ты никогда не сможешь.

А при чем тут они? си — это вообще не ООП? А плюсы — вроде, чисто компилируемый, его никто «динамическим» не называет.

Ты же хочешь детали реализации, но языков, на которых эти реализации делают, не знаешь (и знать не хочешь). На что вообще надеешься?

i-rinat ★★★★★
()
Ответ на: комментарий от exception13

Ты зачем флудишь? У тебя какие то проблемы, и ты их решил излить тут? Это не нужно, обратись к специалистам. Убедительная просьба либо высказываться по теме, либо не высказываться, если сказать нечего.

somequest
() автор топика
Ответ на: комментарий от i-rinat

А зачем чтобы знать, как работает черный ящик, знать его внутреннее устройство? Странные какие-то выводы у Вас.

somequest
() автор топика
Ответ на: комментарий от i-rinat

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

somequest
() автор топика
Ответ на: комментарий от i-rinat

Даже си можно написать на питоне, например. А потом опять питон на этом си. Тут, если не касаться вопросов перформанса, концептуально нет разницы в контексте рассмотрения.

somequest
() автор топика
Ответ на: комментарий от hateyoufeel

Нет, ты что-то попутал. Я упомянул хаскель, как один из примеров языка жрущего память, только в этом смысле.

somequest
() автор топика
Ответ на: комментарий от somequest

А зачем чтобы знать, как работает черный ящик, знать его внутреннее устройство?

Я вижу ту тонкость, которую ты не можешь понять. И из всех языков, с которыми я сталкивался, эта тонкость наиболее ярко проявляется в C и C++.

Наверное, можно объяснять физику людям, не имеющим понятия об интегрировании, но это будет очень трудно. Так школьникам на олимпиадах приходится в решении задач воспроизводить это самое интегральное исчисление, чтобы проверяющие не придирались. Получается очень громоздко. Ты, наверное, ждёшь, что тебе тоже так громоздко (но в рамках твоих знаний) объяснят. Зря. Тебя просто будут гнобить.

Хочешь понимать реализации — выучи языки, которые выбирают для реализации. Их не зря выбирают.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от somequest

если не касаться вопросов перформанса

Только вот ты их касаешься.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

можно объяснять физику людям

По моему, Вы опять путаете. Можно объяснить принцип работы какого-то *физического* механизма, например, ГРМ автомобиля, человеку далекому от физики, и не факт, что физик это поймет лучше. Это вещи вообще ортогональные. Точно также, как в любой модели, мы просто описываем, как это работает, реализация не важна. Тут важно, какую абстракцию мы берем за основу. Есть понятие память, и объект. Объект может либо использовать дополнительную память, либо, в случае повторного использования кода, просто делегировать функционал другому коду. Это универсальный принцип, и все предельно ясно для любой реализации. Именно об этом в данном случае речь. А в качестве памяти я могу использовать что угодно, хоть утюги, это не повлияет на принцип использования.

Это типичная ошибка, искать ключ к пониманию модели в конкретной реализации этой модели. Это ведет к бесконечному регрессу, когда чтобы понять А сначала надо понять B, а чтобы понять B надо понять C, и этот путь бесконечен, в итоге поциэнт вообще никогда и ничего не понимает. Следуя этой логике, чтобы понять си, например, ты должен понять как *физически* устроена память компьютера, что является абсурдом, безусловно.

somequest
() автор топика
Ответ на: комментарий от somequest

*физического* механизма, например, ГРМ автомобиля

Знаешь, почему махмат и физфак разные факультеты? Если в твоём понимании физика ограничивается механическими системами (физика в играх, да?), тебя ждёт множество увлекательных открытий.

как *физически* устроена память компьютера

Я знаю :-) Тут многие знают. Некоторые фишки, например недавнюю атаку на DRAM, нельзя объяснить в рамках твоих моделей «объекты и память», там нужно знание деталей реализации.

Есть понятие память, и объект.

Гхы-гхы. Объекты и память. Это же надо так перемешать уровни абстракции!

Это типичная ошибка, искать ключ к пониманию модели в конкретной реализации этой модели.

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Все что ты говоришь, выглядит вроде гладко, на первый взгляд, но это все не работает. Ты подбиваешь к мысли, что, якобы, невозможно знать более высокий уровень, не зная более низкого. Это идея фикс. И IRL это не работает. В частности, если бы это было так, все сишники писали бы на высокоуровневых ЯП лучше, а мы наблюдаем обратную картину, особенно что касается динамических языков.

Типичная ошибка — взять догматом утверждение о том, что можно всё объяснить в рамках заранее произвольно выбранной модели

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

somequest
() автор топика
Ответ на: комментарий от somequest

Ты чем читаешь? Я уже упоминал, что школьники воспроизводят интегральное исчисление. Но как только изучаешь азы, это всё (аппроксимации, суммы бесконечно малых величин) становится не нужным. Так и здесь. Можно объяснить, только зачем?

Хочешь понять — выучи C, тогда ответ будет одной строкой (вообще-то тебе на понадобится ответ, ты сам его найдёшь по пути). Расписывать тут простыни текста как-то лениво.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Не убрали, а срастили с функциями, в данном случае это не суть важно.

Mahmood
()

Постойте! А скаких пор js стал ООП-языком? В нём же чисто прототипная идеология. Сравнивать питон и жабаскрипт в этом плане не корректно. Видимо ОП даже разницу между прототипным и ооп программированием не понимает.

// Либо я в 4 часа ночи не понял сути наезда...

itn ★★★
()
Ответ на: комментарий от itn

Постойте!

Всё нормально, это анонiмус.

shrub ★★★★★
()
Ответ на: комментарий от itn

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

Deleted
()
Ответ на: комментарий от itn

Обсуждать ты тут по-любому ничего не сможешь, обсуждалка не выросла еще. Тебя тут, в данном случае, попросили обосновать конкретно твое кукареку, а не обсуждать.

anonymous
()
Ответ на: комментарий от itn

А почему не «ооп - не ооп, потому что там есть деление на классы и экземпляры, в отличие от прототипного ооп»?

Deleted
()
Ответ на: комментарий от winlook38

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

itn ★★★
()
Ответ на: комментарий от Deleted

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

Solace ★★
()
Ответ на: комментарий от Solace

Мне кажется, у человека в его сознании вообще какая-то лютая каша, сдобренная ВЕРОЙ В КЛАССЫ. С таким сознанием лучше не появляться в /development/.

Deleted
()
Ответ на: комментарий от Solace

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

Deleted
()
Ответ на: комментарий от Deleted

Спокойней, бро. Я и не заявлял что мои слова истина в последней инстанции, особенно в первом своём посте, сейчас сам не понимаю как такое мог написать.

Но это не меняет моей решительной позиции что подходы в написании кода несколько отличаются (я не силён в ECMAScript, но точно помню что понятие «объект» иное нежели в Python).

Если я в чём-то не прав, буду рад если ты меня просветишь и я буду тебе благодарен.

itn ★★★
()
Последнее исправление: itn (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.