Python’self’关键字

Python 'self' keyword

我刚接触过python(通常在c_上工作),在过去的几天里开始使用它。

在一个类中,是否需要在对该类的任何调用之前加上数据成员和方法的前缀?所以,如果我从该类中调用一个方法或从该类中获取一个值,我需要使用self.method()self.intvalue

我只是想确认一下,我还没有遇到一种更详细的方法。


没有冗长的方式。总是使用EDCOX1 0来访问实例属性EDCOX1(1)。注意,与C++中的EDCOX1 2不同,EDCOX1×3 }不是关键字。您可以给方法的第一个参数指定任意名称,但强烈建议您遵循调用它self的约定。


我将补充SVEN(准确)的回答,回答自然的后续问题(即为什么self是明确的而不是含蓄的?).

python是这样工作的,因为它在词汇作用域的概念上工作的:裸名称引用总是引用当前函数定义中的局部变量、包含函数定义的局部变量、模块的全局变量或内置变量。(作用域是词法上的,因为在符号分析过程中,当沿着解析树向下时,只需要记住在指向当前函数的路径上的函数定义中看到的名称-任何其他名称都可以被处理为"看不到,因此是全局的或内置的"。还值得明确指出的是,作用域规则与函数定义的嵌套相关,而不是与调用相关)。

在这方面,方法没有任何特殊的处理方法-类语句在很大程度上与词汇范围规则无关,因为在某些语言中没有相同的锐利的函数与方法区别(相反,当从对象中检索相关属性时,方法是从函数动态创建的)。

这允许在已经定义函数之后将其添加到类中,并且与在类语句主体(称为"monkeypatching"的过程)中定义的方法不可区分。

由于对象名称空间与词汇作用域规则是分开的,因此有必要提供其他方法来引用这些属性。这是显式self处理的任务。

注意,对于复杂的算法,将成员变量的引用缓存为方法中的局部变量并不少见。


首先,python的self不是关键字,它是一种编码约定,与python的cls相同。

guido写了一篇关于python支持类的起源的非常详细和有价值的文章,在那篇文章中,guido解释了为什么使用selfcls,以及为什么它们是必需的。

请参阅http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html。