zoukankan      html  css  js  c++  java
  • 【python基础】之装饰器

    一、闭包概念

    #定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包.
    
    def outer():
        x = 10
        def inner():  #条件一:inner是内部函数
            print(x)  #条件二:外部环境的一个变量
        return  inner
    
    
    inenr()  #报错,找不到引用变量
    
    func = outer()#将inner的引用对象赋值给in_func
    func() #相当于执行inner()

    二、装饰器

    #定义:本质依旧是函数,其作用是 在不修改代码的前提下,为已经存在的函数添加额外的功能。
    
    import time
    
    def show_time(f):  # 此函数作用相当于:将旧函数带入,返回一个同名新函数
    
        def inner():
            start = time.time()
            f()
            end = time.time()
            print('spend %s' % (end -start))
        return  inner
        
    
    @show_time  # 等同于 foo =show_time(foo) = inner
    def foo():
        print('hello')
        time.sleep(2)
    
    
    foo() #等同于inner()

    三、被装饰函数的参数

    import time
    
    def show_time(f):  
    
        def inner(a,b):
            start = time.time()
            f(a,b)
            end = time.time()
            print('spend %s' % (end -start))
        return  inner
        
    
    @show_time  
    def foo(a,b):
        print(a+b)
        time.sleep(1)
    
    
    foo(1,2) #等同于inner(1,2)

    四、装饰器参数

    import time
    
    def logger(flag):
    
        def show_time(f):  
    
            def inner(a,b):
                start = time.time()
                f(a,b)
                end = time.time()
                print('spend %s' % (end -start))
                
                if flag=='true':
                    print('操作日志打印中')
                
            return  inner
            
        return  show_time
        
    
    @logger('true')  
    def foo(a,b):
        print(a+b)
        time.sleep(1)
        
    @logger('') 
    def fuu(a,b):
        print(a-b)
        time.sleep(1)
    
    
    foo(1,2) #执行打印操作日志
    fuu(1,2) #不执行打印操作日志
    
    '''
    @logger('true') 做了两件事:
    
        (1)logger('true'):得到闭包函数show_time,里面保存环境变量flag
    
        (2)@show_time   :foo=show_time(foo)
    
    上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。
    当我们使用@logger('')调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。
    '''
  • 相关阅读:
    财务统计
    Drupal 7 模 .info 文件描述
    怎么样MyEclipse配置Tomcat?
    QQ旅程server分析01-网关server
    UVa 988
    人工智能的策略,如果国家优先发展”梦想成真”?
    苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例
    【剑指offer】两个队列实现堆栈
    证券从业改革
    Qt调用word 例子
  • 原文地址:https://www.cnblogs.com/moshang-huakai/p/9650606.html
Copyright © 2011-2022 走看看