我对这三者感到困惑。我知道闭包是由另一个函数返回的函数,并且可以访问封闭范围内的局部变量
例子:
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
这三者有什么区别?
最佳答案
我认为您混淆了目的和实现。创建闭包是一种做事的技巧。您可以使用闭包做很多事情。
另一方面,partial
和decorator
是特殊目的。也许他们使用闭包。也许他们没有。那是一个实现细节,您无需担心。重要的是他们达到了您想要的结果。
考虑一个部分
。 (忽略 **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/