闭包
内部函数对外部函数作用域里变量的引用。
函数内的属性,都是有生命周期的,都在函数的执行期间。
闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
my_list = [1]
def func(obj):
print('func:', obj)
def func1():
obj[0] += 1
print('func1:', obj)
return func1
var = func(my_list) # func:[1]
var() # func[2]
var() # func[3]
var() # func[4]
装饰器 @
本质:闭包函数
存在的意义:不影响原有功能,还能添加新的功能,也有解耦的功能
# 普通装饰器
def func1(func):
def add_func():
print('这是我要添加的功能')
return func()
# func 函数名
# func() 函数调用
return add_func()
@func1
def func2():
print('hello world')
func2
# 这是我要添加的功能
# hello world
# 被装饰的函数带参数
def func1(func):
def func2(a, b):
print(a, b)
return func(a, b)
return func2
@func1
def func(x, y):
print('this is a add func')
print(x + y)
func(1,1)
# 1 1
# this is a add func
# 2
# 装饰器函数带参数
def arg_func(arg):
def _func(func):
def _func1():
if arg == 'good':
print('出去玩')
if arg == 'bad':
print('不出去玩')
return func()
return _func1
return _func
# arg_func 装饰器函数的参数接收函数,因为装饰器函数只能是接收一个函数作为参数
# arg_func -> _func 接收我们装饰器函数的参数
# _func -> _func1 闭包函数 添加功能
# _func1 -> func 执行添加的功能,执行被装饰的函数
@arg_func('bad')
def func():
print('bad day')
@arg_func('good')
def func1():
print('good day')
func()
func1()
# 不出去玩
# bad day
# 出去玩
# good day