zoukankan      html  css  js  c++  java
  • python之闭包与装饰器

     1、装饰器前戏之闭包:

    闭包的定义:简单来说就是一个内部函数引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。

    def foo():
    x =10
    def inner(): #条件一:inner为一个内部函数
    print(x) #条件二:调用外部变量 X
    return inner #结论 inner被称为闭包

    f=foo() #f 相当于inner

    f() #f()相当与inner(); 即 inner()这个内部函数可在外部调用


    2、装饰器

    装饰器定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator).我的理解是为某个已定义的函数增加某些功能,但是不修改函数原始的定义.

    例子:我们先编写一个做加法的函数(add()),此时我们想加一个功能,统计加法函数所执行花费的时间,但是呢又不想修改原始的函数(add()),并且调用时仍然使用add()进行调用

    方法一:使用闭包

    import time
    def showTime(add):#外部函数
    def inner(a,b):#闭包条件一:inner为内部函数
    start_time=time.time()
    add(a,b)#闭包条件二:引用外部函数add
    end_time=time.time()
    spend_time=end_time-start_time
    print("花费时间为:%s"%spend_time)
    return inner#结论:inner为闭包



    def add(a,b):
    sum=a+b
    time.sleep(1)
    print("%d + %d = %d"%(a,b,sum))


    #执行语句
    
    
    add=showTime(add)#add 相当于inner
    add(1,2) #add(1,2) 相当于执行内部闭包函数inner(1,2)

    方法二:使用装饰器
    import time

    def showTime(add):#外部函数
    def inner(a,b):#闭包条件一:inner为内部函数
    start_time=time.time()
    add(a,b)#闭包条件二:引用外部函数add
    end_time=time.time()
    spend_time=end_time-start_time
    print("花费时间为:%s"%spend_time)
    return inner#结论:inner为闭包



    @showTime #@showTime 相当于 add=showTime(add)
    def add(a,b):
    sum=a+b
    time.sleep(1)
    print("%d + %d = %d"%(a,b,sum))
     
    #执行语句
    add(1,2)


    
    
    

    3、装饰器带参数
    import time
    def decoratorParameter(flag=1):
    def showTime(func):#外部函数
    def inner(a,b):#闭包条件一:inner为内部函数
    start_time=time.time()
    func(a,b)#闭包条件二:引用外部函数
    end_time=time.time()
    spend_time=end_time-start_time
    print("花费时间为:%s"%spend_time)
    if flag ==1:
    print("flag=1时打印")
    return inner#结论:inner为闭包
    return showTime



    @decoratorParameter(1)
    def add(a,b):
    sum=a+b
    time.sleep(1)
    print("%d + %d = %d"%(a,b,sum))
    @decoratorParameter(2)
    def sub(a,b):
    result = a - b
    time.sleep(1)
    print("%d - %d = %d" % (a, b, result))


    #执行语句

    add(1,2)

    print("*"*50)

    sub(2,1)
     
    
    
    
     
     
  • 相关阅读:
    修改linux资源限制
    Windows 建立链接
    Java & ant环境变量配置
    Linux 配置IP
    Spring-MVC 访问静态资源
    Maven 安装与配置
    OIM同步OID(OID-Connector 9.0.4.12)
    Connector|OIM向IBM TDS推送账号(LDAP3)
    TopFreeTheme精选免费模板【20130704】
    30+简约和平铺的WordPress复古主题
  • 原文地址:https://www.cnblogs.com/hhqdsj/p/12807605.html
Copyright © 2011-2022 走看看