這項工作?你可以調用一個以前沒有聲明過的函數嗎?
class Example:
def fun2(self):
fun1()
def fun1()
print "fun1 has been called"
注意首位,而其上面fun1
聲明-is調用fun1
fun2
。我很感興趣的是在類內部按順序調用函數時會發生什麼。
是否有任何情況下函數不會意識到另一個函數,即使函數的調用會被正確解決?
這項工作?你可以調用一個以前沒有聲明過的函數嗎?
class Example:
def fun2(self):
fun1()
def fun1()
print "fun1 has been called"
注意首位,而其上面fun1
聲明-is調用fun1
fun2
。我很感興趣的是在類內部按順序調用函數時會發生什麼。
是否有任何情況下函數不會意識到另一個函數,即使函數的調用會被正確解決?
起初代碼中函數調用fun2
不起作用。它會拋出錯誤信息:NameError: global name fun1' is not defined
。 是否因爲函數必須在被調用之前進行聲明?
No.It原來,異常被拋出,因爲fun1
是外的fun2
範圍。瞭解名稱空間如何工作將照亮異常並回答發佈的問題。
任何函數的名稱空間首先是它自己的函數名稱空間,然後是全局名稱空間。它默認不包含'class'命名空間。但是,它確實(也應該)有權訪問類名稱空間。爲了讓函數知道它正在調用同一個類中的函數,必須在調用函數之前使用關鍵字self
。
那麼,這工作:
class Example:
def fun2(self):
self.fun1() # Notice the `self` keyword tells the interprter that
# we're looking for a function, `fun1`, that is relative to
# the same object (once a variable is declared as an Example
# object) where `fun2` lives.
def fun1(self):
print "fun1 has been called"
# fun1 has been called
現在fun1
是參考能夠通過fun2
,因爲fun2
現在看看類的命名空間。我測試了,這是真的通過運行:
class Example:
def fun2(self):
fun1()
def fun1(self):
print "fun1 was called"
def fun1():
print "fun1 outside the class was called"
沒有self
關鍵字的輸出是:
fun1 outside the class was called
所以,在這裏回答這個問題,當Python解釋腳本它預先編譯所有相關的命名空間。因此,所有功能都知道所有適當解決的其他功能,從而使原始聲明順序無關緊要。
你答案的一部分讓我覺得'fun1'是爲了成爲問題代碼中類的一部分。是這樣嗎? – delnan
@delnan是的。這是正確的。它已被重新編輯。 – seebiscuit
@thefourtheye你錯過了這個問題的關鍵。班上應該有一個'fun1'。另外,我並不認爲這是一個「功能性」問題,因爲類命名空間與問題相關。 – seebiscuit
更新了它。請立即檢查 – thefourtheye
您的實際問題是什麼?你有沒有試過......運行你所問的代碼?我們不是你的翻譯。 – kqr