tft每日頭條

 > 生活

 > python常用的裝飾器

python常用的裝飾器

生活 更新时间:2024-12-14 13:04:58

python常用的裝飾器?如果看完這篇文章,你還是弄不明白裝飾器;,今天小編就來說說關于python常用的裝飾器?下面更多詳細答案一起來看看吧!

python常用的裝飾器(python筆記23什麼是裝飾器)1

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 問題:
  • 如果增加其他數據結構如何處理?
  • 如果有N個這樣函數如何處理?

從上一步修改中可以看到,判斷條件相同,唯一不同時處理方式。

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>

分析:

  1. mySum變量名指向decoFunc中的返回值:checkArgs函數
  2. @decoFunc就是裝飾器的語法糖
  3. 從結果中看到,我們沒有調用mySum函數,但是裝飾器函數會默認執行

裝飾器實質:對比兩個例子,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)

大家看到裝飾器,尤其帶參數的裝飾器,感覺暈暈的, 我們要做的,就是一步一步分析,搞清楚原理; 以上就是裝飾相關内容;

總結:
  • 理解裝飾器,必須先理解閉包;
  • 理解閉包,必須弄清楚作用域及函數返回值;
  • 裝飾器在實際工作,尤其适用第三方框架時候(Djano,Scrapy等),應用十分廣泛
,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved