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

a = A()
a.B()

为什么在 Python 中不能实现上述(如此简单的代码)?是否存在不会将 A() 变成类的“pythonic”(清晰、不出所料、非骇客)解决方法?

编辑1:上面向我解释了B是A的本地,因此它只存在于A被评估时。因此,如果我们将其设为全局(并确保不要将其覆盖),那么为什么这不起作用?

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

a = A()
a.B()

它说它正在返回一个“NoneType”对象。

4

2 回答 2

7

因为函数定义只是在本地命名空间中创建一个名称。您正在做的事情与以下内容没有什么不同:

def f():
    a = 2

然后问为什么你不能a从函数外部访问。绑定在函数内部的名称是函数的本地名称。

此外,您提出的代码很奇怪。当你这样做时a = f(),你将 a 设置为函数的返回值。您的函数不返回任何内容,因此您不能希望通过返回值访问任何内容。可以直接返回内部函数:

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

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

这确实很有用。但是除了修改全局变量(这通常是一个坏主意)或返回值之外,没有通用的方法可以从外部访问函数内部的东西。这就是函数的工作方式:它们接受输入并返回输出;他们不会让外界知道他们的内脏。

于 2012-10-06T05:10:51.577 回答
6

要使用您想要的语法调用 B,请使用:

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

a = A()
a.B()
A.B()
于 2012-10-06T05:46:39.963 回答