python常用的裝飾器?如果看完這篇文章,你還是弄不明白裝飾器;,今天小編就來說說關于python常用的裝飾器?下面更多詳細答案一起來看看吧!
如果看完這篇文章,你還是弄不明白裝飾器;
你來找我,我保證不打你,我給你發100的大紅包。
1. 一個案例1.1 需求:兩個函數mySum:計算列表的和,參數必須為列表
myMax:統計列表的最大值,參數必須為列表
代碼實現:
def mySum(args):
#判斷args是否是列表
if isinstance(args, list):
return sum(args)
return -1
def myMax(args):
#判斷args是否是列表
if isinstance(args, list):
return max(args)
return -1
print(mySum([1,2,3]))
print(mySum((1,2,3)))
print(myMax(123))
結果:6, -1, -1
1.2 新需求:參數可以使元組修改代碼:
def mySum(args):
#判斷args是否是列表
if isinstance(args, (list, tuple)):
return sum(args)
return -1
def myMax(args):
#判斷args是否是列表
if isinstance(args, (list, tuple)):
return max(args)
return -1
print(mySum([1,2,3]))
print(mySum((1,2,3)))
print(myMax(123))
結果:6,6,-1
1.3 問題:從上一步修改中可以看到,判斷條件相同,唯一不同時處理方式。
2. 閉包的應用對上面進行分析,解決方式:
每個函數的核心功能不同,但是判斷條件相同
将相同部分拆分成函數,
閉包使用:
def decoFunc(func):
#checkArgs為内置函數,func對于checkArgs是外部變量
def checkArgs(args):
#統一處理參數
if isinstance(args, (list, tuple)):
return func(args)
return -1
return checkArgs
#自定義的sun函數
mySum = decoFunc(sum)
#自定義max函數
myMax = decoFunc(max)
print(mySum([1,2,3]))
print(mySum((1,2,3)))
print(myMax(123))
結果:6,6,-1
分析:
1.decoFunc(func)中的func對于checkArgs為外部變量
2.decoFunc返回值為checkArgs函數
3.mySum, myMax指向checkArgs函數,但是每個函數内部的func不同
4.mySum, myMax調用之後,檢查args,然後使用不同func處理ars
大家可以把這個過程理解下,然後我們來看裝飾器;
3.裝飾器如何理裝飾器:
1.裝飾器:修改函數并返回新的函數;
2.裝飾器與閉包原理類似,但是隻用來處理函數;
基本語法:
@deco
def func(args):
pass
來看例子
def decoFunc(func):
#checkArgs為内置函數,func對于checkArgs是外部變量
def checkArgs(args):
#統一處理參數
if isinstance(args, (list, tuple)):
return func(args)
return -1
print('checkArgs:', checkArgs)
return checkArgs
@decoFunc
def mySum(args):
return sum(args)
print('mySum:', mySum)
結果:
checkArgs: <function decoFunc.<locals>.checkArgs at 0x000001C4A21580D8>
mySum: <function decoFunc.<locals>.checkArgs at 0x000001C4A21580D8>
分析:
裝飾器實質:對比兩個例子,mySum = decoFunc(mySum)
3.帶參數的裝飾器新需求:在不修改checkArgs參數前提下,調用mySum,myMax前打印相應的函數名
直接上代碼:
def decoFunc(fname):
print("call decoFunc")
#在_decoFunc在加一層函數,返回_decoFunc
def _decoFunc(func):
#checkArgs為内置函數,func對于checkArgs是外部變量
def checkArgs(args):
#統一處理參數
if isinstance(args, (list, tuple)):
print("call func:", fname)
return func(args)
return -1
print('checkArgs:', checkArgs)
return checkArgs
return _decoFunc
@decoFunc('mySum')
def mySum(args):
return sum(args)
print('mySum:', mySum)
mySum([1,2,3,4,5])
結果:
call decoFunc
checkArgs: <function decoFunc.<locals>._decoFunc.<locals>.checkArgs at 0x000001C4A1D00B88>
mySum: <function decoFunc.<locals>._decoFunc.<locals>.checkArgs at 0x000001C4A1D00B88>
call func: mySum
分析:<函數包含關系:decoFunc->_decoFunc->checkArgs
@decoFunc('mySum')執行過程:
1.執行decoFunc('mySum'),設置fname,返回_decoFunc
2.執行@decoFunc('mySum')實質是@返回_decoFunc,
3.mysum = _decoFunc(mySum)
大家看到裝飾器,尤其帶參數的裝飾器,感覺暈暈的, 我們要做的,就是一步一步分析,搞清楚原理; 以上就是裝飾相關内容;
總結:更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!