美文网首页
Python闭包装饰器

Python闭包装饰器

作者: 心水Diana | 来源:发表于2018-12-03 16:15 被阅读0次

闭包

  • 闭包实现
    • 函数嵌套
    • 外函数里包装一个内函数
    • 外函数作用域有一个局部数据对象
    • 内部函数对于外部函数作用域里非全局变量的引用
    • 外函数返回内部函数
def func_wai(a):
    def func_nei():
        print(a)
    return func_nei()

与递归有些类似,将尾递归中return,调用自己,更改为了内部函数

闭包的意义
  • 实现函数内部变量的延续

    每个函数运行都会开辟新的内存空间,在函数结束时,内部变量都将被释放

    闭包则延续了局部变量的生命周期

  • 变量生命周期得到延续,同时也增加了内存损耗

    def wai():
        p = list(range(1000))
        def nei():
            p[0] += 1
            print(p[0])
        return nei
     
    func = wai() # p 是一个保持状态的变量
    #返回值载体 就相当于变量
    #当你不去释放一个变量,会一直存活的
    
    
  • 变量私有化

    每一次闭包函数执行后的返回值都是一个新的,这是因为函数运行首先开辟的都是一块新的函数临时空间 每一次闭包函数执行后,都是返回了一个不一样的闭包函数载体,那么这个载体里的变量,也是不一样的


装饰器

  • 装饰器可以在函数运行前添加功能,并且不影响原有函数内容
    • 实际是将函数作为一个参数,带入到另外一个函数用运行
# 简单的装饰器
def wai(func):
    def nei():
        res = func()
        return res + '你好'
    return nei

@wai
def work():
    return '123'
#------输出---------
work()
  • 被装饰函数带参数

    def wai(func): #装饰器
        def nei(var1,var2):
            var1 = 100  #在闭包函数内部对被装饰函数参数进行干预
            var2 = 99
            return func(var1,var2)
        return nei
    
    @wai
    def work(a,b):
        return a + b
    
    res = work(20,30)  #wai(work)(a,b)
    print(res)
    
  • 装饰器带参数

    def A(*args):
        def B(func):
            def C(a,b):
                print('我是被装饰函数的参数:',a,b)
                print('我是装饰函数的参数:',*args)
                return func
            return C
        return B
    @A('ss')
    def func(a,b):
        pass
    
    func(1,2)
    ----------
    我是被装饰函数的参数: 1 2
    我是装饰函数的参数: ss
    
  • 过程分析

    def wai(b_func): #外函数的参数是一个函数对象
        def nei():
            print("嘿嘿嘿") #在nei函数里写的代码基本上都是添加的功能
            return b_func() #这个是nei函数返回值,用来返回之前在wai函数所接收的参数
            #b_func()
            #return ''
        return nei #返回了wai函数里的这个定义好的闭包容器
    
    @wai #语法糖
    def func():
        print('哈哈哈哈')
        return 'func'
    
    res = func() #调用一个被装饰函数 其实相等于 wai(func)()
    print('func的返回值:',res)
    -------------------------------------
    #func() 传统函数调用
        #1: print('哈哈哈')
        #2: return None
    #func() 被装饰时调用 @wai
        #被装饰函数: func
        #装饰器函数: wai
        #1: wai(func) -> return nei
        #2: nei() ->
            #1: print("嘿嘿嘿")
            #2: return b_func()
                #1: b_func() -> 'func'  #内部调用被装饰函数
                #2: return 'func' #内部闭包函数的返回值 其实是被装饰函数的返回值
    

相关文章

  • Python的自定义超时机制——装饰器的妙用

    装饰器 关于装饰器的入门,可以参考这篇文章:12步轻松搞定python装饰器简单来说,装饰器其实就是一个闭包(闭包...

  • Python装饰器-专题笔记

    学会装饰器,Python更进阶 函数作用域到闭包到装饰器讲解,及闭包和装饰器的运用。 [√] 慕课网Meshare...

  • [python] 装饰器学习

    很多python的代码都带有装饰器=。=现在不学以后也要学学一下装饰器 闭包 在学装饰器之前先看看python的闭...

  • Python 2 - 高级用法 - 装饰器

    Python 2 - 高级用法 - 装饰器 一谈到 装饰器,就离不开闭包 闭包 闭包就是能够读取其他函数内部变量的...

  • Python装饰器——初识

    上次讲了Python的闭包,今天来讲一下闭包的应用——装饰器 1. 装饰器是什么 什么叫装饰器?顾名思义,它是一个...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • python之理解闭包和装饰器

    python之理解闭包和装饰器 1、闭包函数 1.1 python中函数都是对象 结果: 上面定义一个shut函数...

  • 2020-012 python闭包与装饰器

    python闭包与装饰器 闭包 函数和对其周围状态(lexical environment,词法环境)的引用捆绑在...

  • 让Python的装饰器不再难理解

    注意: 如果对闭包不了解的同学请移步到这里先,因为装饰器要通过闭包来实现 前言 刚开始学Python的时候,装饰器...

  • Python 装饰器的诞生过程

    Python中的装饰器是通过利用了函数特性的闭包实现的,所以在讲装饰器之前,我们需要先了解函数特性,以及闭包是怎么...

网友评论

      本文标题:Python闭包装饰器

      本文链接:https://www.haomeiwen.com/subject/nigycqtx.html