我最近看过Sandi Metz撰写的《Nothing is Something》,在她的演讲中,她使用了向对象发送消息的想法,并介绍了在Ruby中是如何完成的。在4:10 -7:30节将是一个很好的切入点,她开始的话题,其中(这是一个构建块,则超过一半的谈话渗透)。
现在,有一些背景知识:我没有很多用Ruby编写程序的经验,而对smalltalk的经验则为零。我的OO经验有限并且非常陈旧。我还查看了send object message python
Google,发现与通过套接字和电子邮件发送消息有关,这与我的想法不完全相同。
我不确定如何在Python中解释这个概念,或者如何实现它。有任何想法吗?:)
旁注:她提到她的面向对象视图是基于smalltalk的经验得出的,因此我将其添加为该问题的标签。
Python使用了稍微不同的术语。这称为“调用方法”。但这是同一回事。(C ++称其为“调用虚函数”。再次,相同的区别。)
我个人不喜欢该术语,它过于关注实现细节,并且失去了“消息发送”术语的许多隐喻功能。
Python还有其他差异,其中一些最重要的差异是:
OO的基本思想是消息传递:您将消息发送到对象,对象会做出响应。就像在现实生活中一样,您不知道对象如何处理消息。您所能看到的就是回复。对象可能会处理消息本身,也可能会使用其他人的帮助,可能会盲目转发消息,而无需实际进行任何工作。
由于您不知道对象对消息有什么作用,而您只能观察到对象的响应,因此您所了解的仅是对象的协议(协议可以理解的消息以及消息对消息的响应方式)。您不知道它的实现,也不知道它的表示。这就是OO实现数据抽象,信息隐藏,数据隐藏,封装的方式。
同样,由于每个对象都独立决定如何响应消息,因此您会得到多态性。
响应消息的一种典型方法是执行与该消息相对应的方法。但这是一种实现机制,这就是为什么我不喜欢该术语的原因。作为一个隐喻,它没有任何我上面提到的含义。
艾伦·凯(Alan Kay)表示,面向对象是关于消息传递,数据抽象和多态性的三件事:
对我而言,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端后期绑定。
后来他澄清说“大事记”:
轻轻提醒一下,我在上一次OOPSLA上付出了一些努力,试图提醒大家,Smalltalk不仅是其语法或类库,甚至与类无关。很抱歉,我很早以前就为该主题创造了“对象”一词,因为它使许多人专注于较小的想法。
最大的想法是“消息传递”-这就是Smalltalk / Squeak的核心所在(这在我们的Xerox PARC阶段中从未完全完成)。日语有一个小字-ma-代表“介于两者之间的事物”,也许最接近的英语是“ interstitial”。制作出色且可扩展的系统的关键在于设计模块的通信方式,而不是设计其内部属性和行为。想想互联网-为了生存,它(a)必须允许超出任何单一标准的许多不同种类的想法和实现,并且(b)允许这些想法之间具有不同程度的安全互操作性。
而且实际上,正如我在上面所述,在我看来,其他两个只是消息传递的结果。
当艾伦·凯(Alan Kay)提出“对象定向”一词时,他受到后来成为ARPANet和Internet的极大启发:独立机器(“对象”)具有自己的私有内存(“实例变量”),可以与之通信通过发送消息彼此。
威廉·R·库克(William R. Cook)重新审视的《关于理解数据抽象》以及他关于“简化的,现代的“对象”和“面向对象”定义的建议”中也提出了类似的观点。
动态分配操作是对象的基本特征。这意味着要调用的操作是对象本身的动态属性。无法静态识别操作,并且一般无法准确地响应给定请求执行什么操作,除非通过运行它。这与始终动态分配的一流函数完全相同。
Python的对象系统与其他语言有点不同。Python最初是一种过程语言,后来又添加了对象系统,目的是使对语言的绝对更改尽可能地减少。Python中dict
的主要数据结构是s(映射/哈希表),所有行为都在函数中。甚至在Python的OO功能之前,这种极简主义就表现出来了,例如,局部变量和全局变量实际上只是。中的键dict
。因此,很自然地使对象和类类似于dict
s并重用该概念,对象本质上是dict
值的,而类是值的dict
功能。没有“方法”的单独思想,相反,您有一些将接收者作为第一个参数的函数。(在大多数其它面向对象的语言中,接收器是使用一个特殊的关键字,例如“隐藏的”第0个参数和可用的self
,this
或me
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句