装饰器、闭包

发布时间 2023-10-16 11:52:07作者: 时光如你般美好

用到了老是忘记,还是记录一下吧,

装饰器、闭包

python的装饰器、闭包是进入Python高级语法的基础,使用装饰器之前,有以下条件:

  • 存在闭包
  • 存在需要被装饰的函数
  • 理解函数地址的概念
理解函数的地址值

众所周知,我们定义函数后,函数名加()可以调用函数,那么我们尝试调用一下函数名呢?

    def test():
        pass
    
    
    def test1():
        pass
    
    
    # 打印函数名
    print(test)

运行结果:

<function test at 0x00000294B0F7E280>

也就是说每个函数名字都存在着他的内存地址值

理解闭包

闭包可以理解成为定义在一个函数内部的函数

在一个函数中定义了一个函数,内部函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用(函数地址值),这样就构成了一个闭包

条件:

  • 存在函数的嵌套关系
  • 内层函数引用了外层函数的变量
  • 外层函数返回内层函数的地址值

话不多说,我们上代码:

# - 存在函数的嵌套关系
# - 内层函数引用了外层函数的变量
# - 外层函数返回内层函数的地址值


def out_func(num):
    def in_func(in_num):
        print("外部函数的变量", num)
        print("内部函数的变量", in_num)
    return in_func


print(out_func(10))
res = out_func(10)
res(5)

运行结果:

<function out_func.<locals>.in_func at 0x000001FBFFD31310>
外部函数的变量 10
内部函数的变量 5
装饰器

在不修改源代码的基础上,给函数增加新的功能

装饰器会将被装饰的函数当作参数传递给装饰器同名的函数

添加装饰器,需要:

  • 存在闭包
  • 存在需要被装饰的函数

例如我们想给一个函数增加一个“输入密码”的功能,在原则上我们是不会区修改原函数的代码内容的,那么怎么实现呢?我们可以使用装饰器,给函数添加功能。

def out_func(login):
    def in_func():
        print("密码输入完成")
        login()
    return in_func


@out_func
def login():
    print("登录成功")


login()

运行结果:

密码输入完成
登录成功

这样就在不修改原来函数的基础上增加了新的功能。