2012-10-06 72 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时它都是一个不同的函数。这是首先嵌套函数的唯一原因。 –