Python是我最了解的语言,奇怪的是我仍然不知道为什么我在Java或PHP中输入“self”而不是“this”。
我知道Python比Java早,但我无法弄清楚它是从哪里来的。特别是因为您可以使用任何名称而不是“自我”:程序将正常工作。
那么这个约定来自哪里?
答案 0 :(得分:65)
Xerox在1980年发布的Smalltalk-80使用了self
。 Objective-C(20世纪80年代早期)将Smalltalk功能层叠在C上,因此它也使用self
。 Modula-3(1988),Python(20世纪80年代后期)和Ruby(20世纪90年代中期)也遵循这一传统。
C ++,也可以追溯到20世纪80年代早期,选择this
代替self
。由于Java是为C / C ++开发人员所熟悉的,因此它也使用this
。
Smalltalk使用对象发送消息的比喻,因此“self”只表示对象正在向自己发送消息。
答案 1 :(得分:28)
检查history of Python用户定义的类:
相反,只需定义一个函数,其第一个参数对应于实例,按惯例,该实例名为“self”。例如:
def spam(self,y):
print self.x, y
这种方法类似于我 曾见过Modula-3,它有 已经为我提供了语法 用于导入和异常处理。
这是一个与其他选择一样好的选择。你可能会问为什么C ++,Java和C#选择“这个”就好了。
答案 2 :(得分:19)
Smalltalk,当然早于Java。
答案 3 :(得分:16)
关于python,self
没有什么特别之处。如果您愿意,可以使用this
:
以下是一个例子:
>>> class A(object):
... def __init__(this):
... this.x = 3
...
>>> a = A()
>>> a.x
3
虽然您可以随意命名,但self
是类函数的第一个参数的约定。查看python文档中的paragraph 5 of section 9.4,其中包含:
通常,方法的第一个参数称为self。这不重要 不仅仅是一个惯例:名称self绝对没有特别之处 意思是Python。但请注意,不遵守惯例 你的代码可能对其他Python程序员来说不太可读,而且确实如此 也可以想象,可以编写类浏览器程序 依赖于这样的惯例。
至于惯例,它始于Smalltalk,但也用于Object Pascal,Python,Ruby和Objective-C。 This answer有一个很好的解释。
答案 4 :(得分:8)
Python遵循Smalltalk在方面的脚步 - 在Smalltalk中也使用self。我想真正的问题应该是'为什么Bjarne决定在C ++中使用this
'...
答案 5 :(得分:7)
主要的灵感来自Modula-3,Guido被引入DEC:
Modula-3最终报告正在进行中 大约在同一时间写在那里。 我在那里学到的东西出现了 Python的异常处理,模块, 以及方法明确的事实 在参数中包含“self” 列表。
答案 6 :(得分:6)
我认为,因为明确宣布它更有意义地看到一个名为“自我”而不是“这个”的实际论点。至少从语法的角度来看,“自我”并不像“这”那样依赖于语境。
我不知道自己是否足够清楚,但无论如何这只是一种主观的欣赏。
答案 7 :(得分:2)
self
不是关键字(*)。
self
按惯例表示当前对象的地址
您可以在self
here上获得更多信息。
为什么不this
?这是一个名字的约定。如果您更喜欢,可以使用this
代码。
(*)这个答案已经从一个问why 'self' instead of 'this' keyword
的问题移植和合并。由于第一行的澄清可能对其他人有用,我将它保留在这里。