python - 闭包、部分和装饰器

标签 python

我对这三者感到困惑。我知道闭包是由另一个函数返回的函数,并且可以访问封闭范围内的局部变量

例子:

def add_nums(one):
    def adder(two):
        return one+two
    return adder

a_10 = add_nums(10)
print a_10(5)
15

这里,adder 是一个闭包。

但是,这不也是一个partial

的例子吗?
from functools import partial
a_10 = partial(add_nums, 10)
print a_10()(5)
15

两者有什么区别?

此外,装饰器用于向函数添加功能。

def add_nums(one):
    def adder(two):
        print "foo, bar"
        return one+two
    return adder

a_10 = add_nums(10)
print a_10(5)
foo, bar
15

这三者有什么区别?

最佳答案

我认为您混淆了目的实现。创建闭包是一种做事的技巧。您可以使用闭包做很多事情。

另一方面,partialdecorator 是特殊目的。也许他们使用闭包。也许他们没有。那是一个实现细节,您无需担心。重要的是他们达到了您想要的结果。

考虑一个部分。 (忽略 **kwargs。)创建它的一种方法是使用闭包:

def partial(f, *args):
    def pf(*rest):
        return f(*args, *rest)
    return pf

但它不一定是那样的。例如:

class Partial:
    def __init__(self, func, args):
        self.args = args
        self.func = func

    def __call__(self, *rest):
        f = self.func
        args = self.args
        return f(*args, *rest)

def partial(f, *args):
    return Partial(f, args)

这里没有闭包,只有一个变量保存对其他变量的引用。但是我得到了部分行为,所以谁在乎呢?

装饰器也是如此。装饰器可能是闭包,也可能不是。例如,最近的一个问题涉及在函数的 __doc__ 字符串上运行 str.format。这只是一个接受函数对象、修改 __doc__ 属性并返回相同对象的情况。显然,这不涉及关闭。

关于python - 闭包、部分和装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055508/

相关文章:

python - 当我修改正在运行的 python 程序的源代码时会发生什么?

python - 如何生成没有连续数字的随机整数列表?

python - 将 Flask 类扩展为主应用程序

python - 使用 python 将数据导入 Neo4j 时挂起

python - 在python中的文件中写入多行

python - 在python中测试文件相关功能

python - unicodedata.decomposition() 与 unicodedata.normalize(NFD/NFKD)?

python logging root logger 不显示信息,即使我将级别设置为 INFO

python - Scrapy 元素声明中的 IF 语句

python - Django:基于类的 View 中的模型对象 "has no attribute ' _meta'"