問題很混亂。這是一個例子。Python自我:我必須將自我傳遞給函數來引用自我嗎?
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
這是對的嗎?我不必有:another_fun(self)自稱? 我真的測試過它,它工作。我只是想澄清一下,因爲這讓我有些不確定。
問題很混亂。這是一個例子。Python自我:我必須將自我傳遞給函數來引用自我嗎?
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
這是對的嗎?我不必有:another_fun(self)自稱? 我真的測試過它,它工作。我只是想澄清一下,因爲這讓我有些不確定。
在你的情況下,它是不需要的,因爲another_fun
嵌套到其他功能,因此它捕獲從該函數的局部名字,這包括self
。實際上,從some_fun
可訪問的任何名稱也可從another_fun
訪問。
這就是一些人所說的關閉,編寫創建函數的函數很棒。典型的例子是:
def MultiplyBy(x):
def M(y):
return x * y
return M
Double = MultiplyBy(2)
Triple = MultiplyBy(3)
print Double(10), Triple(10)
這將打印20 30
。
是的,當你在另一個函數中定義一個函數時,內部函數可以從外部函數讀取變量。這不是特定於self
。它適用於在所有功能的全部變量:
>>> def outer():
... a = 2
... def inner():
... print a
... inner()
>>> outer()
2
在Python 2,則不能重新綁定外變量在內部函數(即,可以不做a = 3
上述內部inner
)。在Python 3中,您可以使用nonlocal
聲明來執行此操作。
但是,你爲什麼要這樣做?首先,上面的代碼甚至不會調用another_fun
,所以它所做的並不重要。一般來說,在其他函數中定義函數有點奇怪。這樣做肯定有合法的情況(例如裝飾者),但在很多情況下,這可能會造成混淆。
謝謝,現在我知道什麼是閉包 – dtc