动态语言(如Smalltalk,Ruby和Python)的对象模型有哪些主要差异

时间:2010-01-13 10:34:23

标签: python ruby comparison oop smalltalk

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

关键点是对于任何对象a,在Python中,a.b可能是一个方法(或其他可调用的)或不是:Python编译器不知道(也不关心),你可以使用引用a.b和(例如)将其作为参数传递,将其作为结果返回,将其附加到列表中,依此类推,这些操作都不意味着调用 {{ 1}}。如果你想(试着)调用a.b,你可以通过后缀括号明确地做到这一点:a.b如果你想在没有参数的情况下调用它。

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

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