Python';自我';关键词

Python';自我';关键词,python,Python,我是Python新手(通常在C#上工作),在过去几天开始使用它 在一个类中,是否需要在对该类数据成员和方法的任何调用之前添加前缀?因此,如果我正在调用一个方法或从该类中获取一个值,例如从该类中,我需要使用self.method()或self.intvalue 我只是想检查一下,没有一种我还没有遇到过的不那么冗长的方式。没有一种不那么冗长的方式。始终使用self.x访问实例属性x。注意,与C++中的< >不同,代码>“自我/代码>”不是关键字。你可以给你的方法的第一个参数取任何你想要的名字,但是

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

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


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

没有一种不那么冗长的方式。始终使用
self.x
访问实例属性
x
。注意,与C++中的< <代码> >不同,<>代码>“自我/代码>”不是关键字。你可以给你的方法的第一个参数取任何你想要的名字,但是强烈建议你坚持称它为
self
的惯例。我将用一个自然的后续问题的答案来补充Sven的(准确的)回答(即为什么
self
是显式的而不是隐式的?)

Python的工作方式是这样的,因为它基于词法作用域的思想进行操作:裸名称引用将始终引用当前函数定义中的局部变量、包含函数定义的局部变量、模块的全局变量或内置变量。(范围是词汇性的,因为在符号分析过程中,当您沿着解析树向下时,您只需要记住当前函数路径上的函数定义中看到的名称-其他任何内容都可以处理为“未看到,因此是全局的或内置的”。还值得明确指出的是,作用域规则与函数定义的嵌套相关,而不是调用)

方法在这方面没有给予任何特殊的处理——类语句在很大程度上与词法范围规则无关,因为在某些语言中,函数与方法之间没有明显的区别(相反,当从对象检索相关属性时,将从函数动态创建方法)

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

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


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

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

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


请参阅。

您是否已经了解了这个
self
在Python中不是一个关键字。@nmichaels也可以是:/+1,因为在Python中
self
只是一个表示实例对象的变量名!很抱歉,这是仇恨,但那是什么?中世纪?您在每次函数调用时都会使用“self”?Python无法使用它的原因是什么o像其他人一样走出纸袋,提供对self的隐式访问?@Toskan不,你没有在每个函数调用上显式地传递
self
。它是隐式传递的;你只需要在方法上显式地接受它。我个人更喜欢显式地使用
self
,因为它保持了更清晰的范围。参见also Nick的回答如下,并出于进一步的原因。并非所有其他人都使用隐式访问
self
,也不是所有其他人都做得更好。哦,我不明白……我能做
def()吗:self.member=42
?@Toskan好吧,我的评论、下面尼克的回答和Guido的博客文章中提出了很多观点。我不会在这里重复这些观点。你不必同意他们的观点,但请接受其他人真的喜欢它的方式,并且除了向后兼容之外还有其他原因。在此基础上进行扩展关于类作用域的“基本无关”点,一个例外是Python3.x中的
\uuuu class\uuuu
魔术变量(在方法中使用内置super()时也隐式引用)。当编译器看到这个神奇的变量名时,它会创建一个自动闭包引用,稍后用完全构造的类填充。这只适用于在类作用域中实际定义的方法-猴子补丁方法必须显式命名该类(就像所有函数在2.x中必须做的那样)。有关详细信息,请参阅PEP 3135。