在Python中创建一个闭包可以归结为以下三点:
- 闭包函数必须有内嵌函数
- 内嵌函数需要引用该嵌套函数上一级namespace中的变量
- 闭包函数必须返回内嵌函数
闭包思考:
1.闭包似优化了变量,原来需要类对象完成的⼯作,闭包也可以完成
2.由于闭包引⽤了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
装饰器:
开放封闭原则:
封闭:已实现的功能代码块
开放:对扩展开发
例子:
def w1(func):
def inner():
print("开始验证")
func()
return inner
@w1
def f1():
print('f1')
python解释器就会从上到下解释代码,步骤如下:
1. def w1(func): ==>将w1函数加载到内存
2. @w1
执⾏w1函数
执⾏w1函数 ,并将 @w1 下⾯的函数作为w1函数的参数,即:@w1
等价于 w1(f1) 所以,内部就会去执⾏:
def inner():
#验证 1
#验证 2
#验证 3
f1() # func是参数,此时 func 等于 f1
return inner# 返回的 inner,inner代表的是函数,⾮执⾏函数
w1的返回值
新f1 = def inner():
#验证 1
#验证 2
#验证 3
原来f1()
return inner
要执⾏ f1 函数时,就会执⾏ 新f1 函数,在新f1
函数内部先执⾏验证,再执⾏原来的f1函数,然后将原来f1 函数的返回
值返回
首先,装饰器是按装饰器自下而上执行顺序执行
def makeBold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
#定义函数:完成包裹数据
def makeItalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makeBold
def test1():
return "hello world-1"
@makeItalic
def test2():
return "hello world-2"
@makeBold
@makeItalic
def test3():
return "hello world-3"
print(test1())
print(test2())
print(test3())
例子:
from time import ctime, sleep
def timefun_arg(pre="hello"):
def timefun(func):
def wrappedfunc():
print("%s called at %s %s"%(func.__name__, ctime(), pre))
return func()
return wrappedfunc
return timefun
@timefun_arg("itcast")
def foo():
print("I am foo")
@timefun_arg("python")
def too():
print("I am too")
foo()#foo called at Mon Jul 23 19:36:49 2018 itcast
#I am foo
sleep(2)
foo()#foo called at Mon Jul 23 19:36:49 2018 itcast
#I am foo
too()#too called at Mon Jul 23 19:36:51 2018 python
#I am too
sleep(2)
too()#too called at Mon Jul 23 19:36:51 2018 python
#I am too