闭包和装饰器

闭包和装饰器.

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 装饰器的应用场景:一般主要用于给已经有的函数增加一些功能但是又不用改变已有的函数.经常用于有切面需求的场景,

  1. 引入日志

  2. 函数执行时间统计

  3. 执行函数前预备处理

  4. 执行函数后清理功能

  5. 权限校验等场景

  6. 缓存.

    达到抽离出大量与函数功能无关的雷同代码并继续重用.

2.4 装饰器可以多层装饰,装饰顺序从内到外装饰,调用执行顺序是从外向内执行.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值