装饰器

本文介绍了Python中的闭包和装饰器概念。闭包是函数嵌套形成的实体,涉及函数内部变量的作用域问题,使用`nonlocal`关键字解决局部变量问题。装饰器则是一种语法糖,用于在不修改原有函数代码的情况下,增加额外功能。装饰器执行时会先执行装饰器函数,再将原函数作为参数传递,返回一个新的函数。文中通过多个案例展示了装饰器的应用,包括无参数和有参数的装饰器,以及用于设置访问权限的装饰器。
摘要由CSDN通过智能技术生成

闭包和装饰器:(人生苦短,我用python)

一、闭包:

  • 函数只是一段可执行代码,编译后就“固化”了,每个函数在内存中只有一份实例,得到函数的入口点便可以执行函数了。函数还可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。

  • 闭包实际上就是函数嵌套,就和循环嵌套和if条件嵌套的思想一样,只不过函数嵌套更复杂一点。

  • 闭包是由函数及相关环境的引用环境组合而成的实体(即:闭包 = 函数块 + 引用环境

  • 闭包案例:

    案列01:

    # 外层函数 outer
    def outer(n):
        num = n
        # 内嵌函数 inner
        def inner():
            return num+1
        return inner
        #  注意:return是 outer返回的结果,inner为outer函数的内嵌函数的名字,并没有执行inner  (判断依据;看返回的函数是否加小括号)
    
    print(outer(3)())  # 4
    print(outer(3))   # <function outer.<locals>.inner at 0x0000026610D58400>
    print(outer(5)())  # 5
    # 我们执行outer函数返回的结果为:inner  而inner()则执行函数
    # 注意:print(inner())  这种写法是错误的 必须要先调用外层函数outer
    

    案例02:

    def outer(n):
        num = n
        def inner():
            num = num + 1
            return num
        return inner
    
    print(outer(1)())
    # UnboundLocalError: local variable 'num' referenced before assignment
    

    仔细观察案例01和案例02,我们可以发现区别就在于内嵌函数的使用。在案例01中,内嵌函数直接返回num+1,而在案例02中,内嵌函数内先执行num=num+1的操作,然后才返回的。根据运行结果的提示,显示错误就在num,原因是因为:在python里,只要看到了赋值语句,就会认为赋值语句的左边是一个局部变量。num = num + 1 这段代码里,num=的左边,python解析器会认为我们要修改inner函数里num这个局部变量,而这个变量使用之前是未声明的,所以会报错。

    **解决方案:**使用nonlocal 关键字

    def outer(n):
        num = n
        def inner():
        	# 在内部函数里边,我们修改外部函数的局部函数,
            # 需要加nonlocal
            nonlocal num  # 修改前使用nonlocal关键字对 num 变量进行说明
            num = num + 1
            return num
        return inner
    
    print(outer(2)())
    

二、装饰器:

先认识装饰器:

  • def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值