用到了老是忘记,还是记录一下吧,
装饰器、闭包
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()
运行结果:
密码输入完成
登录成功
这样就在不修改原来函数的基础上增加了新的功能。
标签:闭包,函数,func,print,装饰,def From: https://www.cnblogs.com/edkong/p/17767020.html