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:裝飾帶參數函數
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
def wrapper(*args, **kwargs):
print("執行wrapper_method1 args:", args)
func(*args, **kwargs)
def myfuntion(*args,**kwargs):
print("執行myfunction args:", args)
執行wrapper_method1 args: ('shouke', 'unknow')
執行myfunction args: ('shouke', 'unknow')
例3:函數被多給裝飾器方法裝飾
def wrapper_method2(func):
print("執行wrapper_method2")
func()
@wrapper_method2
執行wrapper_method2
說明:裝飾器方法執行順序為從遠到近,從上到下。
例4:在類中使用裝飾器
class MyClass:
def __init__(self):
pass
@staticmethod
@wrapper_method1
def myfuntion():
print("執行myfunction")
MyClass.myfuntion()
例5:裝飾器方法也可以是類函數
class MyClass2:
def wrapper_method1(func):
def wrapper(*args, **kwargs):
print("執行wrapper_method1")
func(*args, **kwargs)
pass
@MyClass2.wrapper_method1
需要注意的點
1、 即便被裝飾函數擁有預設值也要顯示傳遞參數,否則報錯,如下:
def wrapper(name, age):
print("執行wrapper_method1 name:%s age:%s" % (name, age))
func(name, age)
def myfuntion(name='shouke', age='unknow'):
print("執行myfunction name:%s age:%s" % (name, age))
TypeError: wrapper() missing 2 required positional arguments: 'name' and 'age'
2、 如果被裝飾函數為類的靜态函數時,@staticmethod必須位于最上方,否則報錯,如下:
print("執行wrapper_method1")
Traceback (most recent call last):
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
作者:授客
QQ:1033553122
全國軟體測試QQ交流群:7156436
Git位址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群
