python基础-装饰器进阶
2017-11-11 13:00
399 查看
同一个装饰器对不同函数处理不同
关联多个装饰器
在之前的博客中装饰器初识
了解了函数闭包、装饰器,这篇笔记来继续了解下装饰器的进阶用法
我们先来看一个通用的装饰器写法:
输出如下:
在了解进阶用法之前,我们先来看一个例子引入:
输出如下:
以上的代码其实就是装饰器函数的进阶雏形,只是缺少了@语法糖而已
输出如下:
输出如下:
关联多个装饰器
在之前的博客中装饰器初识
了解了函数闭包、装饰器,这篇笔记来继续了解下装饰器的进阶用法
我们先来看一个通用的装饰器写法:
def wrapper(func): def inner(*args,**kwargs): print("before") ret = func(*args,**kwargs) print("after") return ret return inner @wrapper def func(a): print("func") return a + 1 @wrapper def funcOther(a): print("funcOther") return a + 1 print(func(1)) print("---------") print(funcOther(1))
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/python.py before func after 2 --------- before funcOther after 2 Process finished with exit code 0
在了解进阶用法之前,我们先来看一个例子引入:
def outer(flag): def wrapper(func): def inner(*args, **kwargs): if flag: print("before") ret = func(*args, **kwargs) print("after") return ret return inner return wrapper def func(a): print("a:%d"%a) outer(True)(func)(4) print("------------") outer(False)(func)(4)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/python.py before a:4 after ------------ a:4 after Process finished with exit code 0
以上的代码其实就是装饰器函数的进阶雏形,只是缺少了@语法糖而已
同一个@装饰器对不同函数处理不同
我们来学习装饰器的进阶用法,如果在第一个例中,只对func进行装饰,然而对funcOther不进行装饰,我们就需要修改装饰器函数def outer(flag): def wrapper(func): def inner(*args, **kwargs): if flag: print("before") ret = func(*args, **kwargs) print("after") return ret return inner return wrapper @outer(True) def func(a): print("a:%d"%a) @outer(False) def func1(a): print("a:%d"%a) func(1) print("----------") func1(2)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/python.py before a:1 after ---------- a:2 after Process finished with exit code 0
关联多个@装饰器
以上的例子都是关联一个@,如果我们关联多个@装饰器,那么执行流程是怎样呢?我们看下代码如下:def wrapper1(func): #qqxing def inner1(*args,**kwargs): print('in wrapper 1,before') ret = func(*args,**kwargs) #qqxing print('in wrapper 1,after') return ret return inner1 def wrapper2(func): #inner1 def inner2(*args,**kwargs): print('in wrapper 2,before') ret = func(*args,**kwargs) #inner1 print('in wrapper 2,after') return ret return inner2 @wrapper1 @wrapper2 def qqxing(): print('qqxing') qqxing() #inner2
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/装饰器进阶2.py in wrapper 1,before in wrapper 2,before qqxing in wrapper 2,after in wrapper 1,after Process finished with exit code 0
相关文章推荐
- [Python入门及进阶笔记]Python-基础-数字小结
- [Python入门及进阶笔记]Python-基础-内置函数小结
- Python-Day3 Python基础进阶之集和/文件读写/函数
- <基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法
- Python3基础进阶(二)
- Python基础-装饰器
- python基础——装饰器
- Python基础-装饰器
- <基础原理进阶>机器学习算法python实现【3】--文本分析之朴素贝叶斯分类器
- python进阶(1)基础
- python基础学习(十二)变量进阶
- Python开发基础-Day22反射、面向对象进阶
- [Python入门及进阶笔记]Python-基础-数字小结
- (转)python装饰器进阶一
- Python基础-迭代器&生成器&装饰器
- [Python入门及进阶笔记]Python-基础-函数小结
- [Python入门及进阶笔记]Python-基础-文件处理小结
- Python基础(四) 基础拾遗、数据类型进阶
- 01月03日三周二次【Python基础进阶】
- 对Python中装饰器(Decorator)的理解与进阶