python基础-闭包、装饰器
2017-11-02 17:07
465 查看
闭包
什么是闭包?内部函数引用了外部函数的变量
看下面的代码
def f(b): def f1(): print(b) f1() print(f1.__closure__) f(1)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py 1 (<cell at 0x01406390: int object at 0x56A9D730>,)
在f的内置函数f1中,引用了print(b)变量b
但是下面的代码程序片段,就不是闭包了,我们看下代码如下:
b = 1 def f(): def f1(): print(b) f1() print(f1.__closure__) f()
输出如下:
1 None
print(b)是引用的全局的变量,而不是外部函数的变量
闭包的常用用法
[b]直接调用内部函数[/b]def method(a): def inner(): print(a) inner() print(inner.__closure__) method(1)
输出如下:
1 (<cell at 0x009F6390: int object at 0x5078D730>,)
[b]返回一个内部函数,在进行调用[/b]
########### def f(b): def f1(): print(b) print(f1.__closure__) return f1 f(1)() print("---------")
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py (<cell at 0x00306390: int object at 0x5078D730>,) 1 ---------
[b]从内部函数返回一个值到外部函数[/b]
#从内部函数返回一个值到全局 def f1(): b = 10 def f2(): return b ret = f2() print(f2.__closure__) return ret print(f1())
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py (<cell at 0x03196390: int object at 0x5078D7C0>,) 10
或者如下的写法结果一样的
#从内部函数返回一个值到全局 def f1(): b = 10 def f2(): return b print(f2.__closure__) return f2() print(f1())
装饰器
有了闭包的概念,我们了解下装饰器的使用在不改变函数调用方式的前提下,给函数的前后添加新功能
[b]最简单装饰器[/b]
print("-----最简单装饰器----") def method(): print("我是被装饰的方法") def wrapper(method): def inner(): print("装饰器前") method() print("装饰器后") print(inner.__closure__) return inner wrapper(method)()
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py -----最简单装饰器---- (<cell at 0x00B421D0: function object at 0x00B41A50>,) 装饰器前 我是被装饰的方法 装饰器后
[b]带参数装饰器[/b]
接下来我们为被包装的函数,进行参数传递,我们只能通过其包装函数将参数传递过去,然后为被包装的函数赋值使用
print("-----参数装饰器----") def method(a): print("我是被装饰的方法%d"%a) def wrapper(method): def inner(a): print("装饰器前") method(a) print("装饰器后") return inner(3) wrapper(method)
或者如下:
def method(a): print("我是被装饰的方法%d"%a) def wrapper(method): def inner(a): print("装饰器前") method(a) print("装饰器后") return inner wrapper(method)(3)
输出结果如下:
装饰器前 我是被装饰的方法3 装饰器后
[b]多个函数被装饰[/b]
def method1(a): print("我是被装饰的方法%d"%a) def method2(a): print("我是被装饰的方法%d" % a) def wrapper(method): def inner(a): print("装饰器前") method(a) print("装饰器后") return inner wrapper(method1)(3) wrapper(method2)(4)
输出如下:
装饰器前 我是被装饰的方法3 装饰器后
装饰器前
我是被装饰的方法4
装饰器后
[b]@语法糖[/b]
print("-----@语法糖-------------") def decorate(tempMethod): def inner(): print("装饰器前") tempMethod() print("装饰器后") print(inner.__closure__) return inner @decorate #method = decorate(method) def method(): print("我是被装饰的方法") method()
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py -----@语法糖------------- (<cell at 0x015C6390: function object at 0x031E1810>,) 装饰器前 我是被装饰的方法 装饰器后 Process finished with exit code 0
[b]@语法糖带参数[/b]
print("-----@语法糖-------------") def decorate(tempMethod): def inner(a): print("装饰器前") tempMethod(a) print("装饰器后") print(inner.__closure__) return inner @decorate #method = decorate(method) def method(a): print("我是被装饰的方法%d"%a) method(4)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py -----@语法糖------------- (<cell at 0x03A121D0: function object at 0x03A11810>,) 装饰器前 我是被装饰的方法4 装饰器后 Process finished with exit code 0
或者如下
print("-----@语法糖-------------") def decorate(tempMethod): def inner(a): print("装饰器前") tempMethod(a) print("装饰器后") print(inner.__closure__) return inner(7) @decorate #method = decorate(method) def method(a): print("我是被装饰的方法%d"%a) method
输出的结果是一样的
[b]完整的装饰[/b]
############### 完整的装饰############### def timmer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数 def inner(*args,**kwargs): #在装饰器中需要定义一个内部函数 print('调用func之前') ret = qqxing(*args,**kwargs) #被装饰的函数,并且要执行 print('调用func之后') return ret return inner #将内部函数的名字返回 @timmer #语法糖 func = timmer(func) def func(name): print('%s的公司好老板好同事好'%(name)) return 1111111111 ret = func('俊杰') print('result : %s'%ret)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/3.装饰器.py 调用func之前 俊杰的公司好老板好同事好 调用func之后 result : 1111111111
[b]完整的通用写法[/b]
################ 装饰器的固定结构############### def wrapper(func): def inner(*args,**kwargs): print("---被装饰函数执行之前要添加的代码---") ret = func(*args,**kwargs) print("---被装饰函数执行之后要添加的代码---") return ret return inner @wrapper def method(*args,**kwargs): print("------method------") return args,kwargs ret = method("safly",**{"a":"b"}) print(ret)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/3.装饰器.py ---被装饰函数执行之前要添加的代码--- ------method------ ---被装饰函数执行之后要添加的代码--- (('safly',), {'a': 'b'}) Process finished with exit code 0
相关文章推荐
- python基础 lambda 冒泡 闭包和装饰
- python基础7之闭包与装饰器
- python基础-闭包、装饰器
- Python闭包、函数式编程、装饰器深入理解
- python的闭包与装饰器
- 【语言工具】Python闭包,装饰器,生成器,偏函数,函数式编程,lamda,map,reduce,filter
- Py修行路 python基础 (九)作用域 函数嵌套 闭包
- python 装饰器和闭包
- python基础之高阶函数、匿名函数 、装饰器,文件的读写
- python基础系列(五)之闭包
- python 闭包 装饰器 冒泡排序
- python中的闭包以及对装饰器的理解
- python闭包和装饰器
- python闭包与装饰器
- python 闭包,函数,装饰器,语法糖
- Python基础知识:5:装饰器
- python中函数总结之装饰器闭包详解
- python基础===如何理解装饰器
- Python基础(7)_闭包函数、装饰器
- python 嵌套函数、闭包装饰器、装饰器例子