3

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

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

请你给我一个想法,动态语言,特别是smalltalk,python和ruby在元对象协议的实现方面有何不同?

4

2 回答 2

2

我记得 Python 和 Smalltalk 之间的主要区别是处理属性隐私的方式。在 Smalltalk 中,我定义了属性并且必须立即生成所有访问器(幸运的是 Dolphin Smalltalk 做到了)并使用它们。另一方面,在 Python 中,所有内容都可以访问,甚至是被视为私有的属性(那些以 __ 开头的属性,它们被修改为 ___)。有人可能会说,这有潜在的危险——比如说,在未来的某个时候,当您更改某些属性时,您需要执行一些操作。但是 Python 用properties优雅地解决了这个问题。

我喜欢这个概念,我可以访问任何我想要的东西。只要我知道,我在做什么,我就能做到:-)

于 2010-01-13T14:31:24.527 回答
2

在 Python 中,每个对象都有一个命名空间——对象的“属性”,可在该命名空间中访问,可以是方法、对其他对象的简单引用(可调用或不可调用),或者由描述符动态合成(普通属性可能存在于实例或类中,但描述符——包括作为综合方法的描述符的函数——仅在它们存在于类中时才使用,而不是在实例中;因此,特别是“特殊方法”只有在类中定义时才是特殊的,不是实例)。属性处理内置函数和特殊方法(getattr, setattr, __getattr__, __setattr__, ...)在对象的单个命名空间中以相同的方式工作,无论是否引用“普通属性”。

关键是对于任何 object a,在 Python 中,a.b可能是方法(或其他可调用)或不是:Python 编译器不知道(也不关心),您可以获取引用a.b并(例如)将其作为参数传递,将其作为结果返回,将其附加到列表中,等等,这些操作都不意味着调用 a.b. 如果并且当您想要(尝试和)调用a.b时,您可以通过后缀括号显式地执行它:a.b()如果您想在没有参数的情况下调用它。

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

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

于 2010-01-13T16:06:35.177 回答