【问题标题】:Why do pythonistas call the current reference "self" and not "this"?为什么 pythonistas 将当前引用称为“self”而不是“this”?
【发布时间】:2010-11-07 23:25:21
【问题描述】:

Python 是我最了解的语言,但奇怪的是我仍然不知道为什么我输入的是“self”而不是 Java 或 PHP 中的“this”。

我知道 Python 比 Java 更老,但我不知道这是从哪里来的。特别是因为您可以使用任何名称而不是“self”:该程序可以正常工作。

那么这个约定从何而来?

【问题讨论】:

  • 您可以根据需要使用“this”而不是“self”。但是,这可能会混淆一些语法高亮显示和代码检查工具。使用“self”只是一种约定。
  • “这个”从何而来?
  • 所以当他们滥用“自我”时,就是自虐。
  • C 根本没有。 JavaScript 和 PHP 比 Python 更新……那他们为什么不使用“self”而不是“this”呢?
  • 因为Guido决定使用`self'...

标签: python


【解决方案1】:

施乐于 1980 年发布的 Smalltalk-80,使用了self。 Objective-C(1980 年代早期)将 Smalltalk 的功能层叠加在 C 之上,因此它也使用 self。 Modula-3(1988 年)、Python(1980 年代后期)和 Ruby(1990 年代中期)也遵循这一传统。

同样可以追溯到 1980 年代初期的 C++ 选择了 this 而不是 self。由于 Java 旨在为 C/C++ 开发人员所熟悉,因此它也使用 this

Smalltalk 使用了对象相互发送消息的比喻,所以“self”只是表示对象正在向自己发送消息。

【讨论】:

  • Object Pascal(早期的 Apple 和后来的 Borland 风格,包括 Delphi)也与“self”一起使用。
  • Smalltalk 和 Objective-C 都使用了对象相互发送消息的比喻,所以“self”只是表示对象正在向自己发送消息。 (对我来说,使用“self”而不是“this”似乎更自然。)
  • 不要忘记自我,语言:)
  • 很好的答案,除了在谈论 java 时将 C 和 C++ 的熟悉度混为一谈。大多数在 C 中进行 OOP 的人,例如 gobject 使用 self 专门用于避免在他们的代码曾经包含在 C++ 项目中时保留关键字冲突。
  • @Karl:谢谢,不知道。同意你关于我最后一句话有点混乱的观点。
【解决方案2】:

检查history of Python 以获取用户定义的类:

相反,人们只是简单地定义了一个函数,其第一个参数对应于实例,按照惯例,它被命名为“self”。例如:

def spam(self,y):
    print self.x, y

这种方法类似于我 在 Modula-3 中看到过,它有 已经为我提供了语法 用于导入和异常处理。

这是一个和其他任何选择一样好的选择。你可能会问为什么 C++、Java 和 C# 选择“this”一样容易。

【讨论】:

  • 对不起,伙计,但实际上你只是在重复我在问题中所说的话:python 使用 self,这是一个约定。问题是为什么。
  • 引号和链接解释了 Python 的创建者的动机。很难找到比这更好的“为什么”。 Duffymo 没有重复您的问题 - Guido 是。
  • "...我在 Modula-3 中看到的东西..." - 它的文档比“Smalltalk 因为我说过”更多。我相信历史上的“我”就是BDFL Guido。
  • 没有点击链接。我的错。
  • "为什么 C++、Java 和 C# 选择了 'this'" -> C# 选择了 'this',因为它源自 Java。 Java 选择“this”是因为它源自 C++。 C++ 选择“this”是因为...我不知道:-)
【解决方案3】:

Smalltalk,当然早于 Java。

【讨论】:

  • 谢谢苍白,今晚会睡得更好。
  • 不知道为什么这个答案有 18 个赞。有什么特别的原因吗?我在这里错过了什么吗?
【解决方案4】:

对于 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 有很好的解释。

【讨论】:

  • 谢谢@jterrace,我不知道我也可以在python中使用this。你的描述也很合理。
  • 将此答案合并到以前的基本相同的问题中 - 您可能想快速回顾一下。
  • “您的代码对其他 Python 程序员的可读性可能较差”,但它可能对所有其他 C#、C++ 和 Java 程序员来说更具可读性,它可能会减轻如果您必须使用 C++ 和 Python 编程,请自行承担。
【解决方案5】:

Python 在这方面追随了 Smalltalk 的脚步 - 在 Smalltalk 中也使用了 self。我猜真正的问题应该是“为什么 Bjarne 决定在 C++ 中使用 this”...

【讨论】:

  • 将此答案合并到以前的基本相同的问题中 - 您可能想快速回顾一下。
【解决方案6】:

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

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

-- 圭多,Linux Journal Interviews Guido van Rossum

【讨论】:

    【解决方案7】:

    我认为,由于它是明确声明的,因此看到一个名为“self”而不是“this”的实际参数更有意义。至少从语法的角度来看,“self”不像“this”那样依赖上下文。

    我不知道我说得够不够清楚,但无论如何这只是一种主观的欣赏。

    【讨论】:

      【解决方案8】:

      self 不是关键字 (*)。

      self按照约定表示当前对象的地址

      您可以通过selfhere获取更多信息。

      为什么不this ?好吧,这是一个名称的约定。如果您更喜欢它,可以使用this 作为您的代码。


      (*) 此答案已从提出why 'self' instead of 'this' keyword 的问题移植并合并到此处。由于第一行中的说明可能对其他人有用,因此我将其保留在这里。

      【讨论】:

      • 将此答案合并到以前的基本相同的问题中 - 您可能想快速回顾一下。
      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多