2012-10-06 53 views
6
def A(): 
    def B(): 
     #do something 

a = A() 
a.B() 

爲什麼Python中不可能有上述(這樣簡單的代碼)?是否存在一種「pythonic」(清晰,不出奇,非hacky)的解決方法,它不會將A()轉換爲類?爲什麼Python不能從外部訪問子功能?

編輯1:上面向我解釋了B對A是局部的,因此它只有在A被評估時才存在。所以如果我們把它變成全球性的(並且一定不要讓它被覆蓋),那麼爲什麼這不起作用呢?

def A(): 
    def B(): 
     #do something 
    return A() 

a = A() 
a.B() 

它說它返回一個'NoneType'對象。

回答

7

因爲函數定義只是在本地名稱空間中創建一個名稱。你在做什麼並不比不同:

def f(): 
    a = 2 

,然後問你爲什麼不能從函數外部訪問a。在函數內部綁定的名稱是函數的本地名稱。

此外,您提出的代碼很奇怪。當你做a = f(),你正在設置一個返回值的功能。你的函數什麼都不返回,所以你不能希望通過返回值訪問任何東西。可以直接返回內部函數:

def f(): 
    def g(): 
     return "blah" 
    return g 

>>> func = f() 
>>> func() 
'blah' 

這確實很有用。但是除了修改全局變量(這通常是一個壞主意)或返回值之外,沒有一種通用的方法可以從外部訪問函數內部的東西。這就是功能的工作原理:他們接受輸入並返回輸出;他們不會讓他們的內臟對外界的話語可用。

5

要調用B帶你想要的語法,使用:

def A(): 
    def B(): 
     print("I'm B") 
    A.B = B 
    return A 

a = A() 
a.B() 
A.B() 
+0

遺憾的是沒有用的,因爲初始化'A.B'有必要調用'A()'至少一次。 :( – prokher

+1

@prokher有必要調用A甚至創建一個嵌套函數,而且每次調用A時它都是一個不同的函數。這是首先嵌套函數的唯一原因。 –