python闭包与装饰器--上篇

函数有三种形式

1.定义形式
2.对象形式(函数变量)
3.调用形式

def outer():
    str1 = "我是outer函数str1"
    print(str1)
    def inner():
        str1 = "我是inner函数str1"
        print(str1)
    return inner
f=outer()
f()
#结果:
#我是outer函数str1
#我是inner函数str1

在这里插入图片描述

函数嵌套

函数的嵌套即在函数内部定义其他的函数。

def outer():
    str1 = "我是outer函数str1"
    print(str1)
    def inner():#此处定义的函数即为函数嵌套
        str1 = "我是inner函数str1"
        print(str1)
    return inner

闭包

闭包:内部函数对其外部函数环境的引用。
条件一:函数要嵌套即存在内部函数和外部函数
条件二:内部函数使用其外函数的环境(即使用外部函数的变量)
条件三:内部函数在外部函数的外部使用。

闭包图示

对于C语言来说若外部函数结束则其内部的一切都结束并被释放,闭包即是python特有的区别去C语言的特性,若外部函数outer返回内部函数inner,且内部函数inner使用了外部函数outer的变量,则该内部函数inner和外部函数的变量str1并不会被释放而是依旧在inner中可以被使用。

装饰器

前提:装饰器是在闭包的基础上建立的。
1.装饰器本质上是一个python函数(一个返回函数的函数),它可让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象(闭包即如此)。
2.装饰器经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。即为已经存在的函数或对象添加额外的功能。
3.装饰器:一个闭包,把一个函数当做参数返回一个替代的函数。

装饰器函数步骤:
1.写外部函数,传入被修饰函数(即已有的函数或功能)
2.返回修饰后的内部函数
3.添加修饰动作(实现增加的功能),以及对被装饰函数的处理
整体可以这样理解:其实就是把被修饰函数穿了衣服变成了此处的内部函数inner

#举例:为已有函数增加打印日志时函数名输出功能
#已有函数
def hello():
    print ("hello world!")
#第一步:传入被修饰函数
def outer(func):#func将为被修饰函数hello
    def inner():
        return func()#内部函数返回的是执行hello函数
    pass
#第二步:返回内部修饰后的内部函数
def outer(func):#func将为被修饰函数
    def inner():
        return func()#内部函数返回的是执行hello函数
    return inner
#第三步
def outer(func):#func将为被修饰函数
    def inner():
        print("[DEBUG]: enter {}()".format(func.__name__))
        return func()#内部函数返回的是执行hello函数
    return inner
#闭包
hello=outer(hello)
hello()
#装饰器
@outer
def hello():
    print ("hello world!")
hello()

这就是装饰器实质即闭包
装饰器用法

原创文章 8 获赞 3 访问量 252

猜你喜欢

转载自blog.csdn.net/wxd296931635/article/details/106007158