特点:
- 函数A作为参数出现,函数B接收函数A作为参数;
- 要有闭包的特点。
def test(): #声明函数
print('===========test============')
t = test
t() #把函数赋值给t
输出:
===========test============
闭包:
def func(number):
a = 100
def inner_func():
nonlocal a
nonlocal number
number += 1
for i in range(number):
a += 1
print(a)
return inner_func
f = func(5)
f()
输出: 106
def test(): #声明函数
print('===========test============')
t = test
t() #把函数赋值给t
def func(f):
print(f)
f()
print('rrrrrr')
func(test)
输出:
<function test at 0x000002A934B42048>
===========test============
rrrrrr
- house是被装饰函数
- 将被装饰函数作为参数传给装饰器
- 执行装饰器函数
- 将返回值赋值给被装饰函数
def decorate(func):
def wrapper():
func()
print('刷漆')
print('装门')
return wrapper
@decorate
def house():
print('我是毛坯房')
house()
我是毛坯房
刷漆
装门
示例:
import time
def decorate(func):
def wrapper():
print('正在校验')
time.sleep(2) # 休眠2秒
print('校验完毕')
func()
return wrapper
@decorate
def f1():
print('=======f1')
f1()
输出:
正在校验
校验完毕
=======f1
注意区别,传参数:
import time
def decorate(func):
def wrapper(x):
print('正在校验')
time.sleep(2) # 休眠2秒
print('校验完毕')
func(x) # 执行原函数,即f1()
return wrapper
@decorate
def f1(n):
print('=======',n)
f1(5)
import time
def decorate(func):
def wrapper(*args,**kwargs): # 参数个数不确定的时候用*args,字典时用**kwargs
print('正在校验')
time.sleep(2) # 休眠2秒
print('校验完毕')
func(*args,**kwargs) # 执行原函数,即f1()
return wrapper
@decorate
def f1(n):
print('=======',n)
@decorate
def f2(name):
print('=======',name)
f1(5)
f2('lily')
输出结果
正在校验
校验完毕
======= 5
正在校验
校验完毕
======= lily
如果装饰器是多层的,先装离得近的:
装饰器带参数:
def outer(a): # 接收装饰器的参数
def decorate(func): # 接收函数
def wrapper(*args,**kwargs): # 接收函数的参数
func(*args,**kwargs)
print('铺地砖{}'.format(a))
return wrapper# 返回出第三层
return decorate# 返回出第二层
@outer(10)
def house(time):
print('我{}拿到了房子'.format(time))
house('2020')
输出:
我2020拿到了房子
铺地砖10