闭包:
函数内的属性,都有生命周期,都是在函数执行期间
内部函数对外部函数 作用域 里 变量 的引用
闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
装饰器:
在不影响原有函数功能前提下,还能添加新的功能
基于闭包
闭包 - example 1
def func():
a = 1
print(id(a))
print('this is func.')
def func1(num):
print("this is func1")
print(num + a)
print(id(a))
return func1
var = func()
var(3)
从上例可以看出
骨架核心代码:
def func():
def func1(num):
...
return func1
var = func
通过函数中定义函数,进行返回,达到在函数外可以得到函数内的参数
百度百科:闭包就是能够读取其他函数内部变量的函数。
即通过将 c 返回出来,可以得到 b 内的信息
其中,在 example 1中两个 a 的地址相同
闭包 - example 2
my_list = [1,2,3,4,5]
def func(obj):
print('func:', obj)
def func1():
obj[0] += 1
print('func1:', obj)
return func1
var = func(my_list)
var()
var()
var()
装饰器 - example 1
def func1(func):
def func2():
print('aaabbb')
return func()
return func2
@func1
def myprint():
print('你好,我是 print')
装饰器内部实现:
return func 返回了函数对象,相当于返回的是 func()
return func() 返回了一个 函数调用
1 func1(myprint)() —> func2 # 接收被装饰的函数作为参数,而且还要继续调用一次
2 func2() ----> print(‘aaabbb’) ----> return func() ----> print(‘你好,我是print’)
核心代码
def func1(func):
def func2():
return func()
return func2
通过闭包丰富内容,传参,执行本身函数
装饰器 - example 2 装饰器带参数
arg_func(sex = 'man')()() ---> func1
func1() ---> func2
func2() ---> ('你不可以生娃') or ('你不可以生娃') b_func
def arg_func(sex):
def func1(b_func):
def func2():
if sex == 'man':
print('你不可以生娃')
if sex == 'woman':
print('你可以生娃')
return b_func()
return func2
return func1
@arg_func(sex = 'man')
def man():
print('好好上班')
@arg_func(sex = 'woman')
def woman():
print('好好上班')
man()
woman()
装饰器 - example 3 被装饰的函数带参数
def func1(func):
def func2(x, y):
print(x, y)
x = 'a'
y = 'b'
return func(x, y)
return func2
@func1
def mysum(a, b): # 实现 a = a + 5
print(a + b)
mysum(1,2)
鸣谢B站UP主:15112899479
学习视频链接:https://www.bilibili.com/video/av18586448