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能够发现这一层的封装,并把参数传递到装饰器的环境中。
    '''
  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/moshang-huakai/p/9650606.html
Copyright © 2011-2022 走看看