日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

裝飾器的定義

裝飾器是一個函數(shù),它可以不改變另外一個函數(shù)的代碼給其添加新功能。這是參與多人項(xiàng)目必須要學(xué)會的技能,學(xué)Python/ target=_blank class=infotextkey>Python可不能錯過裝飾器。

裝飾器的入門

要掌握裝飾器先得理解閉包,如果還沒掌握閉包的朋友可以先看看我昨天寫的關(guān)于閉包的內(nèi)容,掌握了閉包以后再學(xué)裝飾器就很容易了。今天繼續(xù)昨天閉包的案例來講裝飾器。

首先我們有一個計算商品出售時應(yīng)付款和實(shí)付款的函數(shù),代碼如下:

def count(x, prince, number):  # x是折扣比例,prince是單價,number是數(shù)量
    result = prince * number  # result是應(yīng)付款,等于prince乘以number
    pay = result * x  # pay是實(shí)付款,等于應(yīng)付款乘以x折扣比例    print(f'總價是{result}元,實(shí)付{pay}元')

 

python之裝飾器詳解

計算應(yīng)付款和實(shí)付款的簡陋收銀機(jī)

現(xiàn)在客戶提了新的需求,要求運(yùn)行count前先校驗(yàn)密碼,密碼不對的不能執(zhí)行,密碼對的才能執(zhí)行。

一般來說要滿足新的需求肯定得改動相應(yīng)的函數(shù)才能辦到,但是在大型項(xiàng)目里改動不是自己寫的的函數(shù)很容易引起問題。

在python中有一種不需要改動原來函數(shù)的代碼就能對其增加功能的好辦法。辦法如下:

def checkpwd(func):  # 實(shí)現(xiàn)密碼校驗(yàn)功能的裝飾器
    def inner(*args, **kwargs):
        pwd = input('請輸入密碼:')        if pwd == "123456":
            print("密碼正確!")
            return func(*args, **kwargs)  # 執(zhí)行函數(shù)前校驗(yàn)密碼,密碼對才能執(zhí)行
        else:
            print('密碼錯誤')
    return inner
@checkpwd  # 裝飾器。功能等價于count=checkpwd(count)
def count(x, prince, number):
    result = prince * number    pay = result * x    print(f'總價是{result}元,實(shí)付{pay}元')
count(0.8, 2.88, 100)
out:請輸入密碼:123456
密碼正確!總價是288.0元,實(shí)付230.4元

 

python之裝飾器詳解

加了密碼功能的收銀機(jī)

多重裝飾器

現(xiàn)在客戶又提出了新的需求,運(yùn)行count前先要校驗(yàn)折扣值,值的范圍必須在0.5和1之間。

那么我們需要再寫一個校驗(yàn)折扣值范圍的裝飾器,代碼如下:

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@checkdisctdef count(x, prince, number):    result = prince * number    pay = result * x    print(f'總價是{result}元,實(shí)付{pay}元')
count(0.8, 2.88, 100)
count(0.3, 2.88, 100)
out:請輸入密碼:123456
密碼正確!折扣值合理!總價是288.0元,實(shí)付230.4元
請輸入密碼:1234
密碼錯誤!

 

python之裝飾器詳解

帶密碼校驗(yàn)和折扣值校驗(yàn)的最終版收銀機(jī)

注意,多重裝飾器需要注意加載順序和執(zhí)行順序。

  1. 裝飾器的加載順序是由內(nèi)而外,以上案例中加載順序是先加載checkdisct函數(shù),后加載checkpwd函數(shù)。好比穿衣服,先穿內(nèi)衣,后穿外衣。
  2. 裝飾器的運(yùn)行順序是由外而內(nèi),以上案例中執(zhí)行順序是先運(yùn)行完checkpwd函數(shù),后運(yùn)行完checkdisct函數(shù)。好比脫衣服,先脫外衣,再脫內(nèi)衣。

裝飾器的偽裝

通過以上案例我們學(xué)習(xí)了用裝飾器的功能來實(shí)現(xiàn)不改動原來函數(shù)的基礎(chǔ)上給其添加功能,但是還存在一個重要的細(xì)節(jié)沒有做好。就是被裝飾的函數(shù)說明文檔會被遮蔽。說明文檔是非常關(guān)鍵的信息,我們可以用如下的方法實(shí)現(xiàn)既能用好裝飾器又能保證原函數(shù)的說明文檔信息不被遮蔽。

這段是未加裝飾器的函數(shù),打印說明文檔內(nèi)容正常。

def count(x, prince, number):
    '''功能:計算商品應(yīng)付款和實(shí)付款的函數(shù)。
參數(shù):x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數(shù)量。'''
    result = prince * number    pay = result * x    print(f'總價是{result}元,實(shí)付{pay}元')
print(count.__doc__)out:功能:計算商品應(yīng)付款和實(shí)付款的函數(shù)。參數(shù):x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數(shù)量。

如果需要加了裝飾器還能正常打印函數(shù)的說明文檔需要這樣做:

import functools  # 導(dǎo)入函數(shù)工具模塊
def checkdisct(func):    @functools.wraps(func)  # 使用functools模塊的wraps函數(shù),保存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函數(shù),保存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):    '''功能:計算商品應(yīng)付款和實(shí)付款的函數(shù)。
參數(shù):x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數(shù)量。'''
    result = prince * number    pay = result * x    print(f'總價是{result}元,實(shí)付{pay}元')
# count(0.8, 2.88, 100)
# count(0.3, 2.88, 100)
print(count.__doc__)out:
功能:計算商品應(yīng)付款和實(shí)付款的函數(shù)。參數(shù):x是float型,指定折扣額度;prince是float型,指定商品的單價;number是int型,指定商品的數(shù)量。

最后

裝飾器的內(nèi)容還有一節(jié),關(guān)于裝飾器本身參數(shù),留待明天再詳細(xì)講。

關(guān)于裝飾器內(nèi)容不少,但是并不難,要學(xué)好裝飾器需要多多練習(xí)才能真正掌握。

希望學(xué)python的朋友都能掌握好裝飾器。

分享到:
標(biāo)簽:裝飾 python
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定