python - Smalltalk、Ruby 和 Python 等动态语言的对象模型的主要区别是什么

标签 python ruby comparison oop smalltalk

我在过去几周深入了解了 Ruby 对象模型,虽然到目前为止只是过去 ruby​​ 和 python 对象的用户,但我很好奇这些东西在其他语言中可能有何不同。

多年前,我接触过 smalltalk 的 squeak。 Smalltalk 通常被认为是一种面向对象的引用语言,这就是我对它感兴趣的原因。 ruby对象模型不区分对象和类,单例对象的存在使得每一个对象在必要的时候都是原型(prototype)可扩展的。据我所知,所有这些东西都定义为元对象协议(protocol)。与 C++ 或 Java 等其他不太动态或非动态的语言相比,这些东西使生活更轻松。

请您给我一个想法,动态语言,尤其是 smalltalk、python 和 ruby​​ 在元对象协议(protocol)的实现上有何不同?

最佳答案

在 Python 中,每个对象都有一个命名空间——对象的“属性”,在该命名空间中可访问,可以是方法、对其他对象的简单引用(可调用或不可调用),或在飞过descriptors (普通属性可能存在于实例或类中,但是描述符——包括作为合成方法的描述符的函数——只有在它们存在于类中而不是实例中时才会被使用;所以特别是“特殊方法”只是特殊的如果在类中定义,则不是实例)。属性处理内置函数和特殊方法(getattrsetattr__getattr____setattr__、...)在对象的单个命名空间中采用相同的方式,无论是否引用“普通属性”。

关键是对于任何对象a,在Python中,a.b可能是方法(或其他可调用的)也可能不是:Python编译器不知道(也不关心),您可以获取引用 a.b 并(例如)将其作为参数传递,将其作为结果返回,将其附加到列表中,等等,这些操作均不暗示 < strong>调用 a.b。如果您想要(尝试和)调用 a.b,您可以通过后缀括号明确地执行此操作:a.b() 如果您想不带参数地调用它。

在 Ruby 中,对象的方法和属性存在于不同的命名空间中(因此您可以拥有一个具有同名方法和属性的对象,而在 Python 中则不能)并且“仅提及”一个参数- less 方法隐式调用它(因此 c=a.b 可能只是获取属性引用,或者它可能正在调用 a.b();如果 ba 中同时命名方法和属性,我不记得使用什么启发式规则来消除使用歧义)。因此,如果您只想获取方法引用(例如,隐藏在某个容器中或用作参数或返回值),然后执行调用,您可以使用不同的语法。

Smalltalk 也有单独的命名空间,就像 Ruby,但是你不能引用给定对象的“非方法”属性(每个对象只“看到”它自己的属性),所以这种歧义不会出现(但你仍然必须使用特定的消息来提取并稍后调用“方法引用”)。

关于python - Smalltalk、Ruby 和 Python 等动态语言的对象模型的主要区别是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2055966/

相关文章:

python - 正则表达式匹配 CSS

c# - 在 C#/Python 中重命名远程文件服务器上的文件

ruby-on-rails - 在 Yosemite 上安装 Ruby 1.9.2 时出错

ruby - rspec - 如何与预期中的实际 DateTime 进行比较?

字符指针与 NULL 的比较

php - 比较数组 : one array is contained in the second array (key+value)

python - 有没有办法将谷歌云存储中的 csv 文件中的数据加载到 datalab 中的单独变量中?

python - 升级后 Pandas 系列操作非常缓慢

ruby-on-rails - Elasticsearch SocketError (getaddrinfo : Name or service not known)

mysql - 比较两个数据库表的值 -> MySQL