您好,登錄后才能下訂單哦!
本篇內容主要講解“python的裝飾器怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python的裝飾器怎么使用”吧!
裝飾器是一個函數,它可以不改變另外一個函數的代碼給其添加新功能。這是參與多人項目必須要學會的技能,學python可不能錯過裝飾器。
要掌握裝飾器先得理解閉包,如果還沒掌握閉包的朋友可以先看看我昨天寫的關于閉包的內容,掌握了閉包以后再學裝飾器就很容易了。今天繼續昨天閉包的案例來講裝飾器。
首先我們有一個計算商品出售時應付款和實付款的函數,代碼如下:
def count(x, prince, number): # x是折扣比例,prince是單價,number是數量 result = prince * number # result是應付款,等于prince乘以number pay = result * x # pay是實付款,等于應付款乘以x折扣比例 print(f'總價是{result}元,實付{pay}元')
現在客戶提了新的需求,要求運行count前先校驗密碼,密碼不對的不能執行,密碼對的才能執行。
一般來說要滿足新的需求肯定得改動相應的函數才能辦到,但是在大型項目里改動不是自己寫的的函數很容易引起問題。
在python中有一種不需要改動原來函數的代碼就能對其增加功能的好辦法。辦法如下:
def checkpwd(func): # 實現密碼校驗功能的裝飾器 def inner(*args, **kwargs): pwd = input('請輸入密碼:') if pwd == "123456": print("密碼正確!") return func(*args, **kwargs) # 執行函數前校驗密碼,密碼對才能執行 else: print('密碼錯誤') return inner @checkpwd # 裝飾器。功能等價于count=checkpwd(count) def count(x, prince, number): result = prince * number pay = result * x print(f'總價是{result}元,實付{pay}元') count(0.8, 2.88, 100) out: 請輸入密碼:123456 密碼正確! 總價是288.0元,實付230.4元
現在客戶又提出了新的需求,運行count前先要校驗折扣值,值的范圍必須在0.5和1之間。
那么我們需要再寫一個校驗折扣值范圍的裝飾器,代碼如下:
def checkdisct(func): def inner(*args, **kwargs): disct = args[0] if disct >= 0.5 and disct <= 1: print('折扣值合理!') return func(*args, **kwargs) else: print('折扣值不合理!') return inner def checkpwd(func): def inner(*args, **kwargs): pwd = input('請輸入密碼:') if pwd == "123456": print("密碼正確!") return func(*args, **kwargs) else: print('密碼錯誤!') return inner @checkpwd @checkdisct def count(x, prince, number): result = prince * number pay = result * x print(f'總價是{result}元,實付{pay}元') count(0.8, 2.88, 100) count(0.3, 2.88, 100) out: 請輸入密碼:123456 密碼正確! 折扣值合理! 總價是288.0元,實付230.4元 請輸入密碼:1234 密碼錯誤!
注意,多重裝飾器需要注意加載順序和執行順序。
裝飾器的加載順序是由內而外,以上案例中加載順序是先加載checkdisct函數,后加載checkpwd函數。好比穿衣服,先穿內衣,后穿外衣。
裝飾器的運行順序是由外而內,以上案例中執行順序是先運行完checkpwd函數,后運行完checkdisct函數。好比脫衣服,先脫外衣,再脫內衣。
通過以上案例我們學習了用裝飾器的功能來實現不改動原來函數的基礎上給其添加功能,但是還存在一個重要的細節沒有做好。就是被裝飾的函數說明文檔會被遮蔽。說明文檔是非常關鍵的信息,我們可以用如下的方法實現既能用好裝飾器又能保證原函數的說明文檔信息不被遮蔽。
這段是未加裝飾器的函數,打印說明文檔內容正常。
def count(x, prince, number): '''功能:計算商品應付款和實付款的函數。 參數:x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數量。''' result = prince * number pay = result * x print(f'總價是{result}元,實付{pay}元') print(count.__doc__) out: 功能:計算商品應付款和實付款的函數。 參數:x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數量。
如果需要加了裝飾器還能正常打印函數的說明文檔需要這樣做:
import functools # 導入函數工具模塊 def checkdisct(func): @functools.wraps(func) # 使用functools模塊的wraps函數,保存func的說明文檔 def inner(*args, **kwargs): disct = args[0] if disct >= 0.5 and disct <= 1: print('折扣值合理!') return func(*args, **kwargs) else: print('折扣值不合理!') return inner def checkpwd(func): @functools.wraps(func) # 使用functools模塊的wraps函數,保存func的說明文檔 def inner(*args, **kwargs): pwd = input('請輸入密碼:') if pwd == "123456": print("密碼正確!") return func(*args, **kwargs) else: print('密碼錯誤!') return inner @checkpwd @checkdisct def count(x, prince, number): '''功能:計算商品應付款和實付款的函數。 參數:x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數量。''' result = prince * number pay = result * x print(f'總價是{result}元,實付{pay}元') # count(0.8, 2.88, 100) # count(0.3, 2.88, 100) print(count.__doc__) out: 功能:計算商品應付款和實付款的函數。 參數:x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數量。
到此,相信大家對“python的裝飾器怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。