在Python中“将消息发送到对象”的一个好例子是什么?

wTyeRogers

我最近看过Sandi Metz撰写的《Nothing is Something》,在她的演讲中,她使用了向对象发送消息的想法,并介绍了在Ruby中是如何完成的。4:10 -7:30节将是一个很好的切入点,她开始的话题,其中(这是一个构建块,则超过一半的谈话渗透)。

现在,有一些背景知识:我没有很多用Ruby编写程序的经验,而对smalltalk的经验则为零。我的OO经验有限并且非常陈旧。我还查看了send object message pythonGoogle,发现与通过套接字和电子邮件发送消息有关,这与我的想法不完全相同。

我不确定如何在Python中解释这个概念,或者如何实现它。有任何想法吗?:)


旁注:她提到她的面向对象视图是基于smalltalk的经验得出的,因此我将其添加为该问题的标签。

约格午间

Python使用了稍微不同的术语。这称为“调用方法”。但这是同一回事。(C ++称其为“调用虚函数”。再次,相同的区别。)

我个人不喜欢该术语,它过于关注实现细节,并且失去了“消息发送”术语的许多隐喻功能。

Python还有其他差异,其中一些最重要的差异是:

  • 面向对象的数据抽象是通过约定实现的,而不是内置的语言功能(例如Smalltalk,Ruby)或设计模式(方案,ECMAScript)
  • 并非所有子例程都是方法

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因此,很自然地使对象和类类似于dicts并重用该概念,对象本质上是dict值的,而类是值的dict功能。没有“方法”的单独思想,相反,您有一些将接收者作为第一个参数的函数。(在大多数其它面向对象的语言中,接收器是使用一个特殊的关键字,例如“隐藏的”第0个参数和可用的selfthisme)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python中“链接列表”的一个好例子是什么?

来自分类Dev

使用python日志记录模块将消息信息发送到一个文件,并将错误消息发送到另一个文件

来自分类Dev

将大型JSON文件从javascript发送到php的一种好方法是什么?

来自分类Dev

将一个对象发送到另一个对象内的数组

来自分类Dev

将消息发送到线程是什么意思?

来自分类Dev

Django频道组发送仅将消息发送到最后一个频道

来自分类Dev

将一个PHP对象发送到另一个PHP页面

来自分类Dev

通过API请求将大数据集发送到客户端的一种好方法是什么?

来自分类Dev

一个函数返回另一个函数的好例子是什么?

来自分类Dev

如何将消息发送到另一个场景

来自分类Dev

如何仅将消息发送到一个Azure服务总线订阅?

来自分类Dev

将文本消息发送到另一个蓝牙设备时获取StringIndexOutOfBoundsException

来自分类Dev

中继-将延迟的消息发送到另一个队列(Azure ServiceBus)

来自分类Dev

将消息从网页发送到本地系统上的另一个网页

来自分类Dev

Python不和谐的Bot处理来自一个用户的消息并将其发送到Webhook中

来自分类Dev

使用javascript中的postMessage函数将消息从一个域发送到另一个域

来自分类Dev

Odoo 13:如何编写一个好的过滤器以便将数据发送到odoo网站页面?

来自分类Dev

如何使用Scenic将消息从一个场景发送到另一个场景?

来自分类Dev

将Parcelable对象发送到另一个活动

来自分类Dev

一起管道命令的一个好例子是什么?

来自分类Dev

仅用一个按钮将两个表格发送到烧瓶中

来自分类Dev

如何在python中执行代码以将终端发送到另一个文件

来自分类Dev

这有可能吗?将命令/对象从一个python shell发送到另一个?

来自分类Dev

将消息发送到Python脚本

来自分类Dev

如何将一个活动的类对象类型的ArrayList发送到另一个活动?

来自分类Dev

以角度 2 将整个对象从一个组件发送到另一个组件

来自分类Dev

确保在收到NSManagedObjectContextObjectsDidChangeNotification之后而不是之前收到从另一个线程发送到对象的消息。

来自分类Dev

是否可以将全局值发送到OpenModelica中的另一个模型?

来自分类Dev

将数据发送到堆栈中的上一个Fragment

Related 相关文章

  1. 1

    python中“链接列表”的一个好例子是什么?

  2. 2

    使用python日志记录模块将消息信息发送到一个文件,并将错误消息发送到另一个文件

  3. 3

    将大型JSON文件从javascript发送到php的一种好方法是什么?

  4. 4

    将一个对象发送到另一个对象内的数组

  5. 5

    将消息发送到线程是什么意思?

  6. 6

    Django频道组发送仅将消息发送到最后一个频道

  7. 7

    将一个PHP对象发送到另一个PHP页面

  8. 8

    通过API请求将大数据集发送到客户端的一种好方法是什么?

  9. 9

    一个函数返回另一个函数的好例子是什么?

  10. 10

    如何将消息发送到另一个场景

  11. 11

    如何仅将消息发送到一个Azure服务总线订阅?

  12. 12

    将文本消息发送到另一个蓝牙设备时获取StringIndexOutOfBoundsException

  13. 13

    中继-将延迟的消息发送到另一个队列(Azure ServiceBus)

  14. 14

    将消息从网页发送到本地系统上的另一个网页

  15. 15

    Python不和谐的Bot处理来自一个用户的消息并将其发送到Webhook中

  16. 16

    使用javascript中的postMessage函数将消息从一个域发送到另一个域

  17. 17

    Odoo 13:如何编写一个好的过滤器以便将数据发送到odoo网站页面?

  18. 18

    如何使用Scenic将消息从一个场景发送到另一个场景?

  19. 19

    将Parcelable对象发送到另一个活动

  20. 20

    一起管道命令的一个好例子是什么?

  21. 21

    仅用一个按钮将两个表格发送到烧瓶中

  22. 22

    如何在python中执行代码以将终端发送到另一个文件

  23. 23

    这有可能吗?将命令/对象从一个python shell发送到另一个?

  24. 24

    将消息发送到Python脚本

  25. 25

    如何将一个活动的类对象类型的ArrayList发送到另一个活动?

  26. 26

    以角度 2 将整个对象从一个组件发送到另一个组件

  27. 27

    确保在收到NSManagedObjectContextObjectsDidChangeNotification之后而不是之前收到从另一个线程发送到对象的消息。

  28. 28

    是否可以将全局值发送到OpenModelica中的另一个模型?

  29. 29

    将数据发送到堆栈中的上一个Fragment

热门标签

归档