def A():
def B():
#do something
a = A()
a.B()
为什么Python中没有上述(如此简单的代码)?是否有一个'pythonic'(清晰易读,不引人注意,非hacky)的解决方法,不会将A()变成一个类?
编辑1:上面向我解释说B是A的本地,因此只有在评估A时它才存在。因此,如果我们将其设为全局(并确保不会覆盖它),那么为什么这不起作用呢?
def A():
def B():
#do something
return A()
a = A()
a.B()
它说它正在返回一个'NoneType'对象。
答案 0 :(得分:7)
因为函数定义只是在本地名称空间中创建一个名称。你在做什么与:
def f():
a = 2
然后询问为什么你不能从函数外部访问a
。绑定在函数内的名称是函数的本地名称。
此外,您提出的代码很奇怪。当您执行a = f()
时,您正在设置函数的返回值。你的函数什么都不返回,所以你不能希望通过返回值访问任何东西。可以直接返回内部函数:
def f():
def g():
return "blah"
return g
>>> func = f()
>>> func()
'blah'
这确实很有用。但是除了通过修改全局变量(这通常是一个坏主意)或返回值之外,没有通用的方法从外部访问函数内部的东西。这就是函数的工作方式:它们接受输入和返回输出;他们不会把他们的内脏提供给外面的词。
答案 1 :(得分:5)
要使用您想要的语法调用B,请使用:
def A():
def B():
print("I'm B")
A.B = B
return A
a = A()
a.B()
A.B()