python - 有人可以向我解释函数对象和闭包之间的区别吗

标签 python function functional-programming closures

“函数对象”是指某个类的对象,它在某种意义上是可调用的,并且可以在语言中被视为函数。例如,在 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 和 function 的使用会被视为闭包吗?

最佳答案

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

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

关于python - 有人可以向我解释函数对象和闭包之间的区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17584403/

相关文章:

python - 我可以创建一个返回参数组合的 pytest.fixture 吗?

python - 如何保留在 python 的数据框中重复出现的值的第一次出现?

c++ - AOT编译语言是如何实现匿名函数的?

function - 我为这些条件做些什么来遵循 FP?

Python:基于相同元素对多个列表进行分组

Python - 使用单个按键切换 turtle 笔的状态

javascript - 设置函数 javascript 的属性

检查一个数组并返回一个 boolean 值

c++ - Boost Lambda/Phoenix - 如何做返回另一个 lambda 的 lambda?

c# - 如何使用 LINQ 使 C# 'grep' 更具功能性?