2016-09-30 136 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

相關問題