Python'self'关键字

时间:2011-05-16 15:25:54

标签: python

我是Python新手(通常使用C#),在过去几天内开始使用它。

在一个类中,您是否需要为该类数据成员和方法添加前缀?那么,如果我在该类中调用方法或从该类中获取值,我需要使用self.method()self.intvalue,例如?

我只是想检查一下我没有遇到的那种冗长的方式。

3 个答案:

答案 0 :(得分:120)

没有那么冗长的方式。始终使用self.x访问实例属性x。请注意,与C ++中的this不同,self不是关键字。您可以为您的方法的第一个参数提供您想要的任何名称,但强烈建议您坚持调用self的惯例。

答案 1 :(得分:53)

我会补充Sven的(准确的)回答,并回答自然的后续问题(即为什么 self显式而非隐含?)。

Python以这种方式工作,因为它根据词法范围的思想运行:裸名称引用将始终引用当前函数定义中的局部变量,包含函数定义的局部变量,模块的全局变量,或者一个内置的。 (范围界定是词法,因为在符号分析期间遵循解析树时,您只需要记住在当前函数的路径上的函数定义中看到的名称 - 其他任何内容都可以处理为“未见”,因此全局或者内置“。值得明确指出,范围规则与函数定义的嵌套有关,而非调用。)

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

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

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

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

答案 2 :(得分:7)

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

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

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