python 裝飾器使用總結 by:授客 QQ:1033553122 測試環境 win10 python 3.5 例1:一個簡單的例子 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' def wrapper_met ...
python 裝飾器使用總結
by:授客 QQ:1033553122
測試環境
win10
python 3.5
例1:一個簡單的例子
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):# func用於接收被裝飾的函數地址
def wrapper():
print("執行wrapper_method1")
func()#調用被裝飾的函數
return wrapper#返回方法地址,供執行被裝飾函數前調用
@wrapper_method1#等同於wrapper_method1(myfunction)
def myfuntion():
print("執行myfunction")
myfuntion()
運行結果:
執行wrapper_method1
執行myfunction
例2:裝飾帶參數函數
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(name, age):#這裡的參數列表和myfuntion參數列表保持一致
print("執行wrapper_method1 name:%s age:%s" % (name, age))
func(name, age)#記得給要調用的函數傳遞參數
return wrapper
@wrapper_method1
def myfuntion(name, age):
print("執行myfunction name:%s age:%s" % (name, age))
myfuntion('shouke', 'unknow')
運行結果:
執行wrapper_method1 name:shouke age:unknow
執行myfunction name:shouke age:unknow
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1 args:", args)
func(*args, **kwargs)
return wrapper
@wrapper_method1
def myfuntion(*args,**kwargs):
print("執行myfunction args:", args)
myfuntion('shouke', 'unknow')
運行結果:
執行wrapper_method1 args: ('shouke', 'unknow')
執行myfunction args: ('shouke', 'unknow')
例3:函數被多給裝飾器方法裝飾
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1")
func(*args, **kwargs)
return wrapper
def wrapper_method2(func):
def wrapper():
print("執行wrapper_method2")
func()
return wrapper
@wrapper_method1
@wrapper_method2
def myfuntion():
print("執行myfunction")
myfuntion()
運行結果:
執行wrapper_method1
執行wrapper_method2
執行myfunction
說明:裝飾器方法執行順序為從遠到近,從上到下。
例4:在類中使用裝飾器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1")
func(*args, **kwargs)
return wrapper
class MyClass:
def __init__(self):
pass
@staticmethod
@wrapper_method1
def myfuntion():
print("執行myfunction")
MyClass.myfuntion()
運行結果:
執行wrapper_method1
執行myfunction
例5:裝飾器方法也可以是類函數
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
class MyClass2:
@staticmethod
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1")
func(*args, **kwargs)
return wrapper
class MyClass:
def __init__(self):
pass
@staticmethod
@MyClass2.wrapper_method1
def myfuntion():
print("執行myfunction")
MyClass.myfuntion()
運行結果:
執行wrapper_method1
執行myfunction
需要註意的點
1、 即便被裝飾函數擁有預設值也要顯示傳遞參數,否則報錯,如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(name, age):
print("執行wrapper_method1 name:%s age:%s" % (name, age))
func(name, age)
return wrapper
@wrapper_method1
def myfuntion(name='shouke', age='unknow'):
print("執行myfunction name:%s age:%s" % (name, age))
myfuntion()
運行結果:
TypeError: wrapper() missing 2 required positional arguments: 'name' and 'age'
2、 如果被裝飾函數為類的靜態函數時,@staticmethod必須位於最上方,否則報錯,如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1")
func(*args, **kwargs)
return wrapper
class MyClass:
def __init__(self):
pass
@wrapper_method1
@staticmethod
def myfuntion():
print("執行myfunction")
MyClass.myfuntion()
運行結果:
Traceback (most recent call last):
執行wrapper_method1
File "E:/PrivateReops/CassTestManage/TMP/backend/mytest.py", line 34, in <module>
MyClass.myfuntion()
File "E:/PrivateReops/CassTestManage/TMP/backend/mytest.py", line 9, in wrapper
func(*args, **kwargs)
TypeError: 'staticmethod' object is not callable