Python的闭包和装饰器

时间:2022-02-20 07:08:02

什么是闭包

  python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用。

  闭包的作用就是让一个变量能够常驻内存。

def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs f1, f2, f3 = count() >>> f1()
9
>>> f2()
9
>>> f3()
9

装饰器(decorator)

装饰器就是为了不修改原函数的定义,并使原函数在运行时动态增加功能的方式,一般来说装饰器是一个返回函数的高阶函数。

def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper

装饰器使用时要借助@语法:

@log
def now():
print('2019-3-25')

@语法相当于执行了语句:

now = log(now)

注意:

为了使加过装饰器的函数仍然就有原函数相同的__name__等属性,可以使用以下方法:

import functools

def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper 带参数:
import functools def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator