首页 > 其他分享 >闭包与装饰器

闭包与装饰器

时间:2022-11-13 22:22:19浏览次数:47  
标签:闭包 return 函数 inner 装饰 def

闭包:

正常情况下,上例中a变量在return语句后,a变量会被释放。但由于内部inner函数继续调用a变量,导致a变量没有被释放。这种现象叫闭包

def outer():
    a=1
    def inner():
        print(a)
    return inner        #在这并没有执行inner函数。只是返回inner的对象
var = outer()()           #outer()() = inner()

 

 

装饰器

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

# 1. 简单的装饰器
def test():
    print("人生苦短,我用python")
#
#
# 装饰器的书写步骤
# 1.书写闭包
# 2.传参:给outter设置参数,该参数表示需要被增加的功能函数
def outter(func):
    def inner():
        # 3.调用原函数
        func()
        # 4.增加新功能
        print("PYTHON")

    # 5.将装饰之后的结果返回【方便在函数外面调用】
    return inner
# 6.然后进行调用
f = outter(test)
f()



"""
装饰器的执行顺序:
1.f = outter(test),调用outter函数,func = test , f = inner
2.f(),调用inner函数
3.func(), 调用test原函数
"""
 

带参数的装饰器

#带参数的装饰器
def dec(flag):
    def add(fun):
        def inner(*args,**kwargs):
            if flag == '+':
                fun(*args,**kwargs)
            else:
                return None
        return inner
    return add
@dec('+') #如果需要在装饰器添加函数,则需要在装饰器函数里在包一层函数,用来接收参数 def fun2(a,b): print(a+b) fun2(1,2)

 

#执行顺序,首先执行dec('+'),返回add对象,
# 此时,将fun2对象作为参数, 传给add。返回inner对象。
#最后将inner接收fun2的1 2参数。在inner函数里调用fun2()。
# 总结:函数的参数,在inner函数接收。装饰器的参数,在最外层的装饰器函数接收。

 

标签:闭包,return,函数,inner,装饰,def
From: https://www.cnblogs.com/powfu/p/16887188.html

相关文章

  • 【JS基础】闭包
    概念:闭包是指有权访问另一个函数作用域中的变量的函数。在JS中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单理解成‘定义在一个函数内部的函数’。 ......
  • Python之递归函数与装饰器
    Python之递归函数与装饰器文章目录​​Python之递归函数与装饰器​​​​递归的含义:​​​​python中的时间模块​​​​装饰器​​递归函数在函数内部,可以调用其他函数。如......
  • JavaScript闭包详细讨论
    functiont1(){ varage=20; functiont2(){ alert(age); } returnt2;}在js中,t1执行过程中,又生成了t2,而从作用域上来说t2能访问到age=20,返回t2时,于是"a......
  • python装饰器
    函数式编程复习:defmap_test(func,array):array_new=[]foriinarray:array_new.append(func(i))returnarray_newprintmap_test(lambdax:x**2,rang......
  • typescript装饰器
    属性装饰器参数exportdefaultfunction(proto,key){//两个参数}给属性增加metadataimport'reflect-metadata';exportdefaultfunction(label,type?......
  • python基础(三)装饰器
    字典推导式:data_list=['1hello','2world']result={item.split("")[0]:item.split("")[1]foritemindata_list}print(result)data='wd=搜狗&rsv_spt=1&r......
  • 闭包
    闭包(Closure)它与JavaScript中的垃圾回收(每门语言的垃圾回收是不一样的)有点联系什么是环境呢?就比如一个城市,在城市里面,我们会有很多设施:公园、医院、学校、商业广场.......
  • 设计模式学习(九):装饰器模式
    设计模式学习(九):装饰器模式作者:Grey原文地址:博客园:设计模式学习(九):装饰器模式CSDN:设计模式学习(九):装饰器模式装饰器模式装饰器模式是一种结构型模式。顾名思义,就是对某......
  • [JavaScript-09]闭包函数
    1.闭包函数//闭包函数vara=123;functionf1(){console.log(a);varb=234;functionf2(){console.log(b);}returnf2;}......
  • JS知识点梳理之作用域、作用域链、柯里化、闭包
    一、作用域与作用域链作用域是指js变量使用时所存在的一个区域,分为全局作用域(window)和局部作用域(function、setTimeout...等都会产生局部作用域)。当局部作用域变量名与......