Каковы основные различия в объектных моделях динамических языков, таких как Smalltalk, Ruby и Python - PullRequest
3 голосов
/ 13 января 2010

Я погрузился в понимание объектной модели Ruby в последние недели, и хотя до сих пор был лишь пользователем плодов объектов ruby ​​и python в прошлом, мне стало интересно, как эти вещи могут отличаться в других языках. *

Несколько лет назад я прикоснулся к писку. Smalltalk часто фигурирует как ссылочный объектно-ориентированный язык, поэтому я заинтересован в нем. В объектной модели ruby ​​не делается различий между объектами и классами, существование одноэлементного объекта делает каждый объект прототипом расширяемым при необходимости. Как я знаю, все эти вещи определены как мета-объектный протокол. Эти вещи делают жизнь проще, чем другие, менее динамичные языки, такие как C ++ или Java.

Не могли бы вы дать мне представление о том, как динамические языки, особенно smalltalk, python и ruby, отличаются в реализации протокола мета-объекта?

Ответы [ 2 ]

2 голосов
/ 13 января 2010

В Python каждый объект имеет одно пространство имен - «атрибуты» объекта, доступные в этом пространстве имен, могут быть методами, простыми ссылками на другие объекты (вызываемыми или нет) или синтезироваться на пролететь мимо дескрипторов (обычные атрибуты могут жить в экземпляре или в классе, но дескрипторы - включая функции как дескрипторы, которые синтезируют методы - используются, только если они живут в классе, а не в экземпляре; в частности, «специальные методы» являются специальными, только если они определены в классе, а не в экземпляре). Встроенные функции обработки атрибутов и специальные методы (getattr, setattr, __getattr__, __setattr__, ...) одинаково работают в одном пространстве имен объекта, независимо от того, ссылаются ли они на «простые атрибуты» или нет .

Ключевым моментом является то, что для любого объекта a в Python a.b может быть методом (или другим вызываемым) или нет: компилятор Python не знает (и не заботится), вы можете взять ссылку a.b и (например) передать его в качестве аргумента, вернуть его в качестве результата, добавить его в список и т. Д., Ни одна из этих операций не предполагает вызова a.b. Если и когда вы хотите (попробуйте и) вызвать a.b, вы сделаете это явно, добавив круглые скобки: a.b(), если вы хотите вызвать его без аргументов.

В Ruby методы и атрибуты объекта находятся в отдельных пространствах имен (так что вы можете иметь объект с методом и атрибутом с тем же именем, чего в Python вы не можете) и «просто упомянуть» аргумент. Метод less вызывает его неявно (так что c=a.b может просто принимать ссылку на атрибут или он может вызывать a.b(); если b называет метод и атрибут в a, я не помню, что за эвристика правило используется для устранения неоднозначности использования). Поэтому, если вы хотите просто взять ссылки на методы (например, сохранить в некотором контейнере или использовать в качестве аргументов или возвращаемых значений), а затем выполнить вызов, вы используете другой синтаксис.

Smalltalk также имеет отдельные пространства имен, такие как Ruby, но тогда вы не можете ссылаться на атрибуты «не-метода» данного объекта (каждый объект только «видит» свои собственные атрибуты), поэтому эта двусмысленность не возникает (но вы по-прежнему приходится использовать конкретные сообщения для извлечения и последующего вызова «ссылки на метод»).

2 голосов
/ 13 января 2010

Основное различие между Python и Smalltalk, которое я помню, заключается в способе обработки атрибута приватности. В Smalltalk я определил атрибуты и должен был мгновенно сгенерировать все средства доступа (к счастью, Dolphin Smalltalk сделал это) и использовать их. С другой стороны, в Python можно получить доступ ко всему, даже к атрибутам, считающимся закрытыми (те, которые в начале имеют __, которые искажены для формирования ___). Кто-то может сказать, что это потенциально опасно - скажем, в какой-то момент в будущем вам нужно будет выполнить некоторые операции, когда вы измените определенный атрибут. Но Python решает это изящно, с свойствами .

Мне нравится идея, что я могу получить доступ ко всему, что захочу. Если бы я только знал, что я делаю, я могу это сделать: -)

...