您的位置:首页 > 编程语言 > Python开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: