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"只表示对象正在向自己发送消息.
duf*_*ymo 28
相反,只需定义一个函数,其第一个参数对应于实例,按惯例,该实例名为"self".例如:
def spam(self,y):
print self.x, y
Run Code Online (Sandbox Code Playgroud)
这种方法类似于我在Modula-3中看到的东西,它已经为我提供了导入和异常处理的语法.
这是一个与其他选择一样好的选择.您可能会问为什么C++,Java和C#选择"this"同样容易.
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.这个答案有很好的解释.
主要灵感来自Modula-3,Guido在DEC上被介绍:
Modula-3最终报告大约在同一时间写在那里.我在那里学到的东西出现在Python的异常处理,模块以及方法在参数列表中明确包含"self"的事实中.
- Guido,Linux Journal访谈Guido van Rossum
我认为,因为它明确地宣称它更有意义地看到一个名为"self"而不是"this"的实际参数.至少从语法的角度来看,"自我"不像"这"那样依赖于语境.
我不知道自己是否足够清楚,但无论如何这只是一种主观的欣赏.