作为一pythoner,对闭包肯定都不陌生。
计算机科学中,闭包(Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。通俗点说闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式是在一个函数内创建另一个函数,被创建的函数可以访问到外部函数的局部变量。那么,为什么要在一个函数内定义另一个函数,让内部函数访问外部函数的局部变量?像有些语言,比如c语言,就没有闭包这种东西,可见闭包也并不是不可或缺的东西,哪怕在python里面,一切用到闭包的地方,其实都可以去掉闭包给出一个无闭包的等价实现。
比如装饰器,就使用了闭包。
def wrapper(func):
def inner(*arg, **kwarg):
ret = func(*arg, **kwarg)
return ret
return inner
@wrapper
def fn():
print("fn called")
fn()
下面是等价的去闭包的实现。
class wrapper:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
ret = self.func(*args, **kwargs)
return ret
@wrapper
def fn():
print("fn called")
fn()
由此可见,闭包并非必须,但是没有闭包,只能像上面那样,要用类去实