为什么pythonistas将当前引用称为"self"而不是"this"?

e-s*_*tis 48 python

Python是我最了解的语言,奇怪的是我仍然不知道为什么我在Java或PHP中键入"self"而不是"this".

我知道Python比Java早,但我无法弄清楚它是从哪里来的.特别是因为您可以使用任何名称而不是"自我":程序将正常工作.

那么这个约定来自哪里?

Jim*_*ans 67

施乐于1980年发布的Smalltalk-80使用self.Objective-C(20世纪80年代早期)将Smalltalk特征层叠在C上,因此它也使用self.Modula-3(1988),Python(20世纪80年代后期)和Ruby(90年代中期)也遵循这一传统.

C++,也可以追溯到20世纪80年代早期,this而不是self.由于Java被设计为C/C++开发人员熟悉,因此它也使用this.

Smalltalk使用对象发送消息的比喻,因此"self"只表示对象正在向自己发送消息.

  • Object Pascal(早期的Apple和后来的Borland风味,包括Delphi)也采用了"自我". (10认同)
  • Smalltalk和Objective-C都使用对象发送消息的比喻,因此"self"只表示对象正在向自己发送消息.(对我来说,使用"自我"而不是"这个"似乎更自然.) (7认同)
  • 不要忘记自我,语言:) (3认同)
  • 除了在谈论java时混淆C和C++的熟悉程度,这是一个很好的答案.大多数在C中进行OOP的人,例如[gobject](http://developer.gnome.org/gobject/unstable/),如果他们的代码被包含在C++项目中,则使用`self`专门用于避免保留关键字冲突. (3认同)

duf*_*ymo 28

检查Python历史记录以获取用户定义的类:

相反,只需定义一个函数,其第一个参数对应于实例,按惯例,该实例名为"self".例如:

def spam(self,y):
    print self.x, y
Run Code Online (Sandbox Code Playgroud)

这种方法类似于我在Modula-3中看到的东西,它已经为我提供了导入和异常处理的语法.

这是一个与其他选择一样好的选择.您可能会问为什么C++,Java和C#选择"this"同样容易.

  • 引号和链接解释了Python动机的创建者.要获得比这更好的'为什么'将是困难的.Duffymo没有重复你的问题 - Guido是. (6认同)
  • "......我在Modula-3中看到的东西......" - 它的文档比"Smalltalk更多,因为我这么说." 我相信历史上的"我"是BDFL Guido. (5认同)
  • 对不起伙伴,但实际上你只是重复我在问题中所说的内容:python使用self,这是一个约定.问题是为什么. (2认同)

tra*_*los 19

Smalltalk,当然早于Java.


jte*_*ace 16

关于python,没有什么特别之处self.this如果您愿意,可以使用:

这是一个例子:

>>> class A(object):
...    def __init__(this):
...       this.x = 3
... 
>>> a = A()
>>> a.x
3
Run Code Online (Sandbox Code Playgroud)

虽然你可以随心所欲地命名它self,但是类函数的第一个参数的约定.查看python文档中9.4节的第5段,其中说:

通常,方法的第一个参数称为self.这只不过是一个惯例:名称self对Python来说绝对没有特殊意义.但是请注意,如果不遵循惯例,您的代码可能对其他Python程序员来说可读性较低,并且可以想象可能会编写依赖于此类约定的类浏览器程序.

至于惯例,它始于Smalltalk,但也用于Object Pascal,Python,Ruby和Objective-C.这个答案有很好的解释.

  • 那不是问题. (7认同)

zmb*_*mbq 8

Python遵循Smalltalk在这方面的脚步 - 在Smalltalk中也使用了self.我想真正的问题应该是'为什么Bjarne决定this在C++中使用'......


cdl*_*ary 7

主要灵感来自Modula-3,Guido在DEC上被介绍:

Modula-3最终报告大约在同一时间写在那里.我在那里学到的东西出现在Python的异常处理,模块以及方法在参数列表中明确包含"self"的事实中.

- Guido,Linux Journal访谈Guido van Rossum


for*_*ran 6

我认为,因为它明确地宣称它更有意义地看到一个名为"self"而不是"this"的实际参数.至少从语法的角度来看,"自我"不像"这"那样依赖于语境.

我不知道自己是否足够清楚,但无论如何这只是一种主观的欣赏.