1 闭包:首先从结构上说,必须是嵌套函数,内部函数必须用到外层函数的参数,外层函数的返回值必须是内层函数的引用.
其次,本质上是数据和功能的结合.数据就是由外层函数提供,功能由内层函数实现.类似于定义了一个类.
def out_func(*args):
def inner_func():
#实现功能的区域
print(args)
return inner_func
2装饰器:本质上是引用的重定向.基于python中一切皆对象.践行的原则是:开放封闭原则(也就是已经实现功能的代码,是封闭的不允许随意改动,可以扩展开发,增加功能.)
要求:装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象。
2.1 装饰器一般是由闭包实现的.简单结构如下
def out_func(func): def inner_func(): #装饰代码 print("执行装饰代码") return func() return inner_func #进行装饰 @out_func #相当于 调用 test_decorator=out_func(test_decorator) def test_decorator(): print("这是测试..........") test_decorator()
2.2 通用装饰器
import functools def log(*ar,**kw): def decorator(func): @functools.wraps(func) def wrapper(*args,**kw): print("%s (%s)"%(text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log("args")#相当于先执行log函数,然后用decorator函数进行装饰. def now(): print("----------------") now()
2.3 装饰器也可以由类来实现.
class Test():
def __init__(self,func):
self.func=func
def __call__(self,*args,**kw):
return self.func(*args,**kw)
@Test
def my_log(*args,**kwargs):
#具体业务逻辑
pass
2.3 装饰器的应用场景:一般主要用于给已经有的函数增加一些功能但是又不用改变已有的函数.经常用于有切面需求的场景,
引入日志
函数执行时间统计
执行函数前预备处理
执行函数后清理功能
权限校验等场景
缓存.
达到抽离出大量与函数功能无关的雷同代码并继续重用.
2.4 装饰器可以多层装饰,装饰顺序从内到外装饰,调用执行顺序是从外向内执行.