闭包的定义:
定义一个函数,在函数的内部再定义一个内部函数,并且这个函数用到了外部函数的变量,那么将内部函数和用到的变量称之为闭包。
闭包的定义示例:
# 定义一个外部函数
def decorator(func):
# 再函数内部再定义一个内部函数
def inner():
print("这是一个闭包")
# 内部函数引用了外部函数的变量
func()
# 返回内部函数的函数名指向的地址,即返回闭包
return inner
主要作用:
闭包提高了代码的可复用性,但是由于使用了外部函数的变量使函数在运行完后变量不会被释放,所以闭包具有保存变量的功能,可以说闭包是一个轻量级的类,但是也增加了内存的消耗。
装饰器的定义:利用python中的语法糖“@”和闭包实现对原有函数的功能拓展。装饰器的功能:
引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景
缓存
1.0 无参数无返回值的函数装饰
def decorator(func):
def inner():
print("正在添加一个装饰器...")
func()
return inner
@decorator
def func():
print("这是一个无参数无返回值的函数...")
func()
2.0 无参数有返回值的函数装饰
def decorator(func):
def inner():
print("正在添加一个装饰器...")
return func()
return inner
@decorator
def func():
print("这是一个无参数有返回值的函数...")
return "返回值:",True
print(func())
3.0 有参数无返回值的函数装饰
def decorator(func):
def inner(num):
print("正在添加一个装饰器...")
func(num)
return inner
@decorator
def func(num):
print("这是一个有参数无返回值的函数...")
print("参数为:", num)
func(10)
4.0 有参数有返回值的函数装饰
def decorator(func):
def inner(num):
print("正在添加一个装饰器...")
return func(num)
return inner
@decorator
def func(num):
print("这是一个有参数有返回值的函数...")
return "参数为:", num
print(func(10))
5.0 带参数的装饰器(装饰器工厂)
# 在装饰器函数外层再嵌套一层函数,参数由最外层函数传入
def outer(params):
def decorator(func):
def inner(num):
if params is True:
print("正在添加一个装饰器...")
return func(num)
return inner
return decorator
@outer(True)
def func(num):
print("这是一个有参数有返回值的函数...")
return "参数为:", num
print(func(10))
6.0 万能装饰器:添加*args和**kwargs接收多余的参数
def decorator(func):
def inner(num, *args, **kwargs):
print("正在添加一个装饰器...")
func(num, *args, **kwargs)
return inner
@decorator
def func(num, *args, **kwargs):
print("这是一个有参数有返回值的函数...")
print("需要的参数为:", num)
print( "多余的参数为:", args, kwargs)
func(10, 20, a=10, b=20)
7.0 类装饰器
class decorator(object):
# init初始化后就就会返回一个实例对象
def __init__(self, func):
self.__func = func
print("正在添加一个类装饰器...")
# 要想起到装饰器的作用,必须定义__call__方法,这样类在装饰器调用的才会自动执行被装饰的函数
def __call__(self, *args, **kwargs):
self.__func()
@decorator
def func():
print("这是一个被装饰的函数...")
func()