zoukankan      html  css  js  c++  java
  • python基础--闭包and装饰器

    闭包函数:函数内部定义的函数;引用了外部变量但非全局变量

    装饰器:有了闭包的概念再去理解装饰器就会相对容易一些。python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后的名字;内层函数(闭包)负责修饰被修饰函数。

        实质:是一个函数

        参数:是你要装饰的函数(并非函数调用)

        返回:是装饰完的函数名(也非函数调用)

        作用:为已经存在的对象添加额外的功能

        特点:不需要对对象做任何代码上的变动

        使用装饰器的原因:

            开放封闭原则:对扩展是开放的、对修改是封闭的

        应用场景:

            插入日志、性能测试、事务的处理等等。

        装饰器最大的作用就是对于我们已经写好了的程序,我们可以抽离一些雷同的代码然后去组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时候源码去除了大量冗余的代码,内容就会变的更加清晰和逻辑化。

        必须遵循的两个原则:

            1、不改变被装饰对象的源码

            2、不改变转世对象的(可调用对象)调用方式

    import time
    def timmer(func):
        def wrapper(*args, **kwargs):
            start = time.time()
            res = func(*args, **kwargs)
            stop = time.time()
            print(stop-start)
            return res
        return wrapper
    
    
    @timmer
    def index(name):
        print('my name is %s' % name)
    
    
    index('william')
    简单计算时间的装饰器

    装饰器库 -->functools

    可是使用functools.wraps()方法来输出原来没有调用装饰器函数之前的函数

    多层装饰器:

        装饰器在装饰的时候  顺序是从下往上

        装饰器在执行的时候  顺序是从上往下

  • 相关阅读:

    c#常用的基础概念
    Visual Studio2010+SOS.dll调试入门 摘自 http://www.cnblogs.com/luminji/archive/2011/01/27/1946217.html
    优化数据库之前的10个问题
    js数组清空的两种方式
    我的资源(网站, 工具)
    iis使用十大原则
    SQL2005分页存储过程
    温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
    无法获得数据库 'model' 上的排他锁 网上搜索结果 IT
  • 原文地址:https://www.cnblogs.com/tulintao/p/11172743.html
Copyright © 2011-2022 走看看