Python中的'self'关键字

61 投票
4 回答
64504 浏览
提问于 2025-04-16 17:44

我刚开始学习Python(平时主要用C#),这几天才开始接触它。

在一个类里面,调用这个类的数据成员和方法时,需要加上前缀吗?比如说,如果我在这个类里调用一个方法或者获取一个值,是不是必须用 self.method() 或者 self.intvalue 这样的写法?

我只是想确认一下,是否还有更简洁的写法我还没遇到。

4 个回答

9

首先,Python中的self并不是一个关键字,而是一种编码习惯,和Python中的cls是一样的。

Guido写了一篇非常详细且有价值的文章,讲述了Python支持类的起源。在这篇文章中,Guido解释了为什么要使用selfcls,以及它们为什么是必要的。

可以查看这篇文章:http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html

55

我来补充一下Sven的回答,解释一下后续自然会问到的问题(也就是为什么要显式使用self而不是隐式的?)。

Python是这样工作的,因为它遵循一种叫做词法作用域的规则:简单的名字引用总是指向当前函数定义中的局部变量、包含函数定义中的局部变量、模块的全局变量,或者是内置变量。(这里的作用域是词法的,意思是当你在解析符号时,只需要记住在当前函数路径上看到的名字 - 其他的可以当作“没见过,所以是全局或内置的”。另外,值得注意的是,作用域规则是和函数定义的嵌套有关,而不是函数调用的嵌套。)

在这方面,方法并没有特别的待遇 - 类的声明对词法作用域规则基本上是无关的,因为在某些语言中,函数和方法之间并没有那么明显的区别(相反,方法是从函数动态创建的,当从对象中获取相关属性时)。

这就允许在类已经定义后再添加一个函数,并且这个函数和在类声明体内定义的方法没有区别(这个过程叫做“猴子补丁”)。

由于对象的命名空间与词法作用域规则是分开的,因此需要提供其他方式来引用这些属性。这就是显式使用self的作用。

需要注意的是,对于复杂的算法,缓存对成员变量的引用作为方法内的局部变量是很常见的做法。

126

没有更简洁的方法。访问实例属性 x 时,总是使用 self.x。需要注意的是,和 C++ 中的 this 不同,self 不是一个关键字。不过,你可以给方法的第一个参数起任何名字,但强烈建议你遵循惯例,还是叫它 self

撰写回答