代码之家  ›  专栏  ›  技术社区  ›  fifigyuri

动态语言(如smalltalk、ruby和python)的对象模型的主要区别是什么

  •  3
  • fifigyuri  · 技术社区  · 15 年前

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

    几年前,我碰到了斯莫尔塔克的吱吱声。Smalltalk通常被认为是一种面向对象的引用语言,这就是我对它感兴趣的原因。Ruby对象模型不区分对象和类,存在的singleton对象使每个对象在必要时都是可扩展的原型。正如我所知,所有这些都定义为元对象协议。这些东西使生活变得比其他更少或非动态语言(如C++或Java)更容易。

    请您给我一个概念,动态语言,特别是smalltalk、python和ruby在实现元对象协议方面有什么不同?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

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

    关键是对于任何对象 a 在蟒蛇, a.b 可能是一个方法(或其他可调用的方法)也可能不是:Python编译器不知道(也不关心),您可以引用 A.B 并且(例如)将其作为参数传递,作为结果返回,将其附加到列表中,等等,这些操作都不意味着 打电话 A.B . 如果你想(尝试和)打电话 A.B ,通过后缀括号显式地执行此操作: a.b() 如果你想不带参数地调用它。

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

    smalltalk也有单独的名称空间,如ruby,但是您不能引用给定对象的“non-method”属性(每个对象只“看到”自己的属性),因此不会出现这种歧义(但您仍然需要使用特定的消息来提取,然后调用“method-reference”)。

        2
  •  2
  •   gruszczy    15 年前

    我记得python和smalltalk的主要区别是处理属性隐私的方式。在smalltalk中,我定义了属性,必须立即生成所有的访问器(幸运的是,Dolphin smalltalk做到了这一点)并使用它们。另一方面,在python中,任何东西都可以被访问,甚至是被认为是私有的属性(那些在开始时带有_uuuuu的属性,这些属性被破坏成了_uuuuuuuuu)。有些人可能会说,这有潜在的危险——比如,在将来的某个时候,当您更改某个属性时,您需要执行一些操作。但是python很优雅地解决了它, properties .

    我喜欢这样的想法,我可以得到我想要的任何东西。如果我知道,我在做什么,我就能做到:—)