2016-09-30 138 views
-1

而不是做以下几点:使用函数参数定义“自我”

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”可能是另一个对象使用的变量)。

+2

它为什么要工作? a,b,c是调用者发送的函数的参数,而不是类中的值。你为什么关心其他对象使用的名称? –

+4

函数/方法变量'(包括它们的参数)范围仅限于它们所用的函数。您不会与项目中的其他任何内容发生冲突。 – daveydave400

+1

你为什么要这样做?它不起作用,因为类中的函数是在类对象之前创建的,“self”就是另一个参数名称*。 –

回答

1

而不是做以下:

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.,因为你的语法无效。让我们看看EBNF函数参数在Python:

parameters: '(' [typedargslist] ')' 

typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' 
    ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' >tfpdef]] 
| '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' >tfpdef) 

tfpdef: NAME [':' test] 

您可能会或可能无法从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 
>>> 

发生了什么事?为什么当self被明确定义时,Python会提出NameError

虽然Python在解析中bar是看到参数self。但是,虽然Python已经“看到”self参数,但它并没有将其定义为名称。所以当Python试图解析第二个参数时,它变得困惑,并且引发了一个NameError。但是,这种行为不仅仅是 方法的专有性。功能有同样的问题还有:

>>> def foo(a, b=a+1): 
    return a, b 

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    def foo(a, b=a+1): 
NameError: name 'a' is not defined 

概括起来; real您的第二个示例不起作用的原因是因为它的Python语法无效。但即使它以某种方式工作,但由于Python解析参数的方式,Python仍然会引发错误。

+0

对不起,为什么函数的参数是类属性没有意义?如果它是一个“设置”功能,其目的是设置三个变量a,b和c呢? – PProteus

+1

@PProteus给我一些时间来解决你的问题更详细的答案。不过需要很长时间。 –

+0

叶,我急切地等待你的解释! – PProteus

相关问题