1

“函数对象”是指类的对象,它在某种意义上是可调用的,并且可以在语言中被视为函数。例如,在 python 中:

class FunctionFactory:
    def __init__ (self, function_state):
        self.function_state = function_state
    def __call__ (self):
        self.function_state += 1
        return self.function_state

>>>> function = FunctionFactory (5)
>>>> function ()
6
>>>> function ()
7

我的问题是 - FunctionFactory 和函数的这种使用是否会被视为闭包?

4

3 回答 3

4

闭包是一个函数,它记住定义它的环境并可以访问周围范围内的变量。函数对象是可以像函数一样调用的对象,但它实际上可能不是函数。函数对象不是闭包:

class FunctionObject(object):
    def __call__(self):
        return foo

def f():
    foo = 3
    FunctionObject()() # raises UnboundLocalError

FunctionObject 无权访问创建它的范围。但是,函数对象的__call__方法可能是闭包:

def f():
    foo = 3
    class FunctionObject(object):
        def __call__(self):
            return foo
    return FunctionObject()
print f()() # prints 3, since __call__ has access to the scope where it was defined,
            # though it doesn't have access to the scope where the FunctionObject
            # was created
于 2013-07-11T03:26:27.493 回答
1

... FunctionFactory 和函数的这种使用是否会被视为闭包?

本身不是,因为它不涉及范围。尽管它确实模仿了闭包的功能。

def ClosureFactory(val):
  value = val
  def closure():
    nonlocal value # 3.x only; use a mutable object in 2.x instead
    value += 1
    return value
  return closure

3>> closure = ClosureFactory(5)
3>> closure()
6
3>> closure()
7
于 2013-07-11T03:24:11.250 回答
0

闭包是一段代码,它关闭定义它的环境,捕获它的变量。在大多数现代语言中,函数都是闭包,但不一定如此,您可以想象闭包不是函数对象(例如 Ruby 块,它们根本不是对象)。

这是闭包的基本测试:

def bar():
    x = 1
    def foo():
        print x
    return foo

x = 2
bar()()

如果它打印 1,foo则为闭包。如果它打印 2,则不是。

于 2013-07-11T03:23:54.667 回答