面向对象的语言有对象。对象是状态和行为的组合。对象需要访问自己的状态。这样做基本上有两个主要选择。要么你明确地说你何时访问一个对象的状态(通过self,this或者其他类似的东西),或者语言会为你找出。
让我先讨论后一种情况。存在名称冲突的问题。例如,如果对象的数据成员与方法参数的名称匹配,或者如果声明与数据成员的名称匹配的局部变量,会发生什么。您要么不允许这种情况,要么具有某种解决机制。Smalltalk是一个像这样工作的语言的例子,但我不记得语言是如何处理碰撞问题的。
在大多数OOP语言,当你从它的一个方法中引用一个对象的状态(或其他方式),你明确地说,就是你用做什么自我,或者这个,或者别的什么东西。这种功能的语言有两种形式。他们要么隐式地这样做 - 这意味着你不必声明链接实体(就像C ++那样)或者你明确地声明它(比如Python)。
请记住,在Python 中调用此链接实体self纯粹是一种约定; 所有程序员都应该遵循的有用约定,但仍然只是一个约定。你可以称之为,或州或我或任何东西,但这将是愚蠢的。该语言的作用是将调用对象显式传递给每个方法作为第一个参数,该参数用于访问状态和其他方法。
最后,Python使用self的方式是一种有利于(如Tony Flury所说)明确的设计决策。我相信很多人都有关于这是一个好的决定还是其他方面的想法。我的意见是,这是一个很好的。