Python 使用;“自我”;函数中的参数定义
而不是执行以下操作:Python 使用;“自我”;函数中的参数定义,python,Python,而不是执行以下操作: def MyFunc(self, a, b, c) self.a = a self.b = b self.c = c def MyFunc(self, self.a, self.b, self.c) def MyFunc(self, a, b, c) self.a = a self.b = b self.c = c def MyFunc(self, self.a, self.b, self.c) 我想做以下工作: de
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
我想做以下工作:
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
为什么这不起作用
如果我必须使用第一种方法,是否有好的方法确保我不会无意中用相同的名称覆盖项目中其他地方使用的变量(例如,“a”可能是另一个对象使用的变量)
而不是执行以下操作:
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
我想做以下工作:
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
def MyFunc(self, a, b, c)
self.a = a
self.b = b
self.c = c
def MyFunc(self, self.a, self.b, self.c)
为什么这不起作用
这不起作用,因为它只是无效的语法。Python将不允许您使用self.
,因为您的语法无效。让我们看看Python中的函数参数:
从上面的EBNF片段中,您可能知道,也可能不知道,但是Python不允许在参数中使用
操作符。这就是为什么你的第二种方法不起作用
不过,让我们假设您的第二个示例是有效的Python语法。这样行吗?简短的回答仍然是否定的。这很简单,因为Python是如何解析函数/方法参数的。让我们看看这个例子:
>>> class Foo:
def __init__(self):
pass
def bar(self, x=self):
pass
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
class Foo:
File "<pyshell#13>", line 4, in Foo
def bar(self, x=self):
NameError: name 'self' is not defined
>>>
总结起来,;第二个示例不起作用的真正原因是它的Python语法无效。但是,即使它确实以某种方式工作,Python仍然会由于其解析参数的方式而引发错误。为什么它要工作?a、 b、c是调用方发送给函数的参数,而不是类中的值。为什么你关心其他对象使用什么名称呢?函数/方法变量(包括它们的参数)的作用域仅限于它们所使用的函数。您不会与项目中的任何其他内容发生冲突。为什么要这样做?它不起作用,因为类中的函数是在类对象之前创建的,而
self
只是另一个参数名。@PProteus:为什么您认为隐藏全局变量是一个问题?只有一个隐藏名称的函数才能访问全局对象。如果这是该函数中的一个问题,请稍后重命名该参数。@p说明:不,Python有。对不起,为什么函数的参数是类属性没有意义?如果它是一个“set”函数,其目的是设置三个变量a、b和c,该怎么办?@PProteus给我一些时间,让我做一个更详细的答案来回答你的问题。不过不会花很长时间的。利夫,我急切地等待着你的解释@好的。现在,看看答案是什么:)