“Python闭包和装饰器”的版本间的差异
跳到导航
跳到搜索
docker>Evan (→参考) |
小 (导入1个版本) |
(没有差异)
|
2019年10月14日 (一) 13:52的版本
要先理解闭包,再理解装饰器
闭包
什么是闭包 #定义一个函数 def test(number): #在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(number_in): print("in test_in 函数, number_in is %d"%number_in) return number+number_in #其实这里返回的就是闭包的结果 return test_in #给test函数赋值,这个20就是给参数number 这时候 ret 指向是test_in 也就是里面的那个function ret = test(20) #注意这里的100其实给参数number_in print(ret(100)) #注意这里的200其实给参数number_in print(ret(200)) 运行结果: in test_in 函数, number_in is 100 120 in test_in 函数, number_in is 200 220 cat 1.py """ --1-- --3-- ************************* --2-- 200 """ def test(number): print("--1--") def test_in(): print("--2--") print(number+100) print("--3--") return test_in ret = test(100) print("*"*25) ret() def test(number): print("--1--") def test_in(): print("--2--") print(number+100) print("--3--") return test_in test(100) #ret = test(100) """ --1-- --3-- """ def test(number): print("--1--") def test_in(number2): print("--2--") print(number+number2) print("--3--") return test_in ret = test(100) print("-"*30) ret(1) ret(100) ret(200) """ python3 01-闭包/01-闭包1.py --1-- --3-- ------------------------------ --2-- 101 --2-- 200 --2-- 300 """
装饰器
把@log放到now()函数的定义处,相当于执行了语句: now = log(now) """ ---正在验证权限---- ---f1--- """ def w1(func): def inner(): print("---正在验证权限----") func() return inner def f1(): print("---f1---") def f2(): print("---f2---") #innerFunc = w1(f1) #innerFunc() #这是的f1 其实是inner了 只有func才是原来的f1 f1 = w1(f1) f1() 运行流程如下 一开始是 f1 = w1(f1) 先算右边的 w1(f1) 这时候 func指向def f1 ,而左边的f1 为def inner 所以 运行最后一行 f1()时 就是先运行 inner fun 打印 ---正在验证权限----,第二步 func() 也就是原来的f1 fun 所以打印---f1--- 不明请看下面的wrapp原理图片 <2019-03-28 四> ****************************分隔线********************************************************** #定义函数:完成包裹数据 """ ----1--- ----2--- ----3--- <b><i>hello world-3</i></b> """ def makeBold(fn): def wrapped(): print("----1---") return "<b>" + fn() + "</b>" return wrapped #定义函数:完成包裹数据 def makeItalic(fn): def wrapped(): print("----2---") return "<i>" + fn() + "</i>" return wrapped @makeBold @makeItalic def test3(): print("----3---") return "hello world-3" ret = test3() print(ret)
参考
https://segmentfault.com/a/1190000004461404
http://www.cnblogs.com/ChrisChen3121/p/3208119.html