python基础-闭包、装饰器
来源:互联网 发布:按键精灵自动录入数据 编辑:程序博客网 时间:2024/06/14 05:29
闭包
什么是闭包?
内部函数引用了外部函数的变量
看下面的代码
def f(b): def f1(): print(b) f1() print(f1.__closure__)f(1)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py1(<cell at 0x01406390: int object at 0x56A9D730>,)
在f的内置函数f1中,引用了print(b)变量b
但是下面的代码程序片段,就不是闭包了,我们看下代码如下:
b = 1def f(): def f1(): print(b) f1() print(f1.__closure__)f()
输出如下:
1None
print(b)是引用的全局的变量,而不是外部函数的变量
闭包的常用用法
直接调用内部函数
def method(a): def inner(): print(a) inner() print(inner.__closure__)method(1)
输出如下:
1(<cell at 0x009F6390: int object at 0x5078D730>,)
返回一个内部函数,在进行调用
###########def f(b): def f1(): print(b) print(f1.__closure__) return f1f(1)()print("---------")
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py(<cell at 0x00306390: int object at 0x5078D730>,)1---------
从内部函数返回一个值到外部函数
#从内部函数返回一个值到全局def f1(): b = 10 def f2(): return b ret = f2() print(f2.__closure__) return retprint(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())
装饰器
有了闭包的概念,我们了解下装饰器的使用
在不改变函数调用方式的前提下,给函数的前后添加新功能
最简单装饰器
print("-----最简单装饰器----")def method(): print("我是被装饰的方法")def wrapper(method): def inner(): print("装饰器前") method() print("装饰器后") print(inner.__closure__) return innerwrapper(method)()
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/demo.py-----最简单装饰器----(<cell at 0x00B421D0: function object at 0x00B41A50>,)装饰器前我是被装饰的方法装饰器后
带参数装饰器
接下来我们为被包装的函数,进行参数传递,我们只能通过其包装函数将参数传递过去,然后为被包装的函数赋值使用
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 innerwrapper(method)(3)
输出结果如下:
装饰器前我是被装饰的方法3装饰器后
多个函数被装饰
def method1(a): print("我是被装饰的方法%d"%a)def method2(a): print("我是被装饰的方法%d" % a)def wrapper(method): def inner(a): print("装饰器前") method(a) print("装饰器后") return innerwrapper(method1)(3)wrapper(method2)(4)
输出如下:
装饰器前我是被装饰的方法3装饰器后装饰器前我是被装饰的方法4装饰器后
@语法糖
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
@语法糖带参数
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
输出的结果是一样的
完整的装饰
############### 完整的装饰###############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 1111111111ret = func('俊杰')print('result : %s'%ret)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/3.装饰器.py调用func之前俊杰的公司好老板好同事好调用func之后result : 1111111111
完整的通用写法
################ 装饰器的固定结构###############def wrapper(func): def inner(*args,**kwargs): print("---被装饰函数执行之前要添加的代码---") ret = func(*args,**kwargs) print("---被装饰函数执行之后要添加的代码---") return ret return inner@wrapperdef method(*args,**kwargs): print("------method------") return args,kwargsret = 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
阅读全文
0 0
- python基础-闭包、装饰器
- python闭包,装饰器
- python 闭包&装饰器
- python--闭包,装饰器
- python 嵌套函数、闭包装饰器、装饰器例子
- python的闭包和装饰器
- python装饰器和闭包
- Python 的闭包和装饰器
- Python 进阶_闭包 & 装饰器
- Python闭包与装饰器
- python中的闭包与装饰器
- python的闭包及装饰器
- Python 闭包与装饰器
- python闭包函数和装饰器
- python闭包和装饰器
- Python的闭包和装饰器
- Python闭包与装饰器总结
- python闭包和装饰器
- rocketmq 启动
- iOS 开发之键盘类型UIKeyboardType
- callable和future和runnable
- session
- knn(k-NearestNeighbor) with scala
- python基础-闭包、装饰器
- C#设计模式之十一外观模式(Facade)【结构型】
- 关于UTC时区
- cookie
- linux 路由表设置 之 route 指令详解
- mysql开启日志功能
- HDP开发常用资源地址及源码编译方法
- caffe深度学习:mnist手写体的识别
- 深入研究 Java Synchronize 和 Lock 的区别与用法