溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python中的裝飾器可以做什么

發(fā)布時(shí)間:2021-08-16 10:36:23 來(lái)源:億速云 閱讀:121 作者:chen 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Python中的裝飾器可以做什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python中的裝飾器可以做什么”吧!

閱讀目錄

一 什么是裝飾器

二 裝飾器需要遵循的原則

三 實(shí)現(xiàn)裝飾器知識(shí)儲(chǔ)備

四 高階函數(shù)

五 函數(shù)嵌套

六 閉包

七 無(wú)參裝飾器

八 裝飾器應(yīng)用示例

一 什么是裝飾器

器即函數(shù)

裝飾即修飾,意指為其他函數(shù)添加新功能

裝飾器定義:本質(zhì)就是函數(shù),功能是為其他函數(shù)添加新功能

二 裝飾器需要遵循的原則

1.不修改被裝飾函數(shù)的源代碼(開(kāi)放封閉原則)

2.為被裝飾函數(shù)添加新功能后,不修改被修飾函數(shù)的調(diào)用方式

三 實(shí)現(xiàn)裝飾器知識(shí)儲(chǔ)備

裝飾器=高階函數(shù)+函數(shù)嵌套+閉包

四 高階函數(shù)

高階函數(shù)定義:

1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名

2.函數(shù)的返回值是一個(gè)函數(shù)名

3.滿(mǎn)足上述條件任意一個(gè),都可稱(chēng)之為高階函數(shù)

 def foo():

    print('我的函數(shù)名作為參數(shù)傳給高階函數(shù)')

def gao_jie1(func):

    print('我就是高階函數(shù)1,我接收的參數(shù)名是%s' %func)

    func()

def gao_jie2(func):

    print('我就是高階函數(shù)2,我的返回值是%s' %func)

    return func

gao_jie1(foo)

gao_jie2(foo)

 #高階函數(shù)應(yīng)用1:把函數(shù)當(dāng)做參數(shù)傳給高階函數(shù)

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    func()

    stop_time=time.time()

    print('函數(shù)%s 運(yùn)行時(shí)間是%s' %(func,stop_time-start_time))

timmer(foo)

#總結(jié):我們確實(shí)為函數(shù)foo增加了foo運(yùn)行時(shí)間的功能,但是foo原來(lái)的執(zhí)行方式是foo(),現(xiàn)在我們需要調(diào)用高階函數(shù)timmer(foo),改變了函數(shù)的調(diào)用方式

 #高階函數(shù)應(yīng)用2:把函數(shù)名當(dāng)做參數(shù)傳給高階函數(shù),高階函數(shù)直接返回函數(shù)名

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    return func

    stop_time=time.time()

    print('函數(shù)%s 運(yùn)行時(shí)間是%s' %(func,stop_time-start_time))

foo=timmer(foo)

foo()

#總結(jié):我們確實(shí)沒(méi)有改變foo的調(diào)用方式,但是我們也沒(méi)有為foo增加任何新功能

 高階函數(shù)總結(jié)

1.函數(shù)接收的參數(shù)是一個(gè)函數(shù)名

  作用:在不修改函數(shù)源代碼的前提下,為函數(shù)添加新功能,

  不足:會(huì)改變函數(shù)的調(diào)用方式

2.函數(shù)的返回值是一個(gè)函數(shù)名

  作用:不修改函數(shù)的調(diào)用方式

  不足:不能添加新功能

五 函數(shù)嵌套

  1 def father(name):

 2     print('from father %s' %name)

 3     def son():

 4         print('from son')

 5         def grandson():

 6             print('from grandson')

 7         grandson()

 8     son()

 9 

10 father('tom')

六 閉包

  1 '''

 2 閉包:在一個(gè)作用域里放入定義變量,相當(dāng)于打了一個(gè)包

 3 '''

 4 def father(name):

 5     def son():

 6         # name='jack'

 7         print('is [%s]' %name)

 8         def grandson():

 9             # name='wupeiqi'

10             print('is [%s]' %name)

11         grandson()

12     son()

13 

14 father('jack')

七 無(wú)參裝飾器

無(wú)參裝飾器=高級(jí)函數(shù)+函數(shù)嵌套

基本框架

1 #這就是一個(gè)實(shí)現(xiàn)一個(gè)裝飾器最基本的架子

2 def timer(func):

3     def wrapper():

4         func()

5     return wrapper

加上參數(shù)

1 def timer(func):

2     def wrapper(*args,**kwargs):

3         func(*args,**kwargs)

4     return wrapper

加上功能

 1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         func(*args,**kwargs)

6         stop_time=time.time()

7         print('函數(shù)[%s],運(yùn)行時(shí)間是[%s]' %(func,stop_time-start_time))

8     return wrapper

 加上返回值

 1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         res=func(*args,**kwargs)

6         stop_time=time.time()

7         print('函數(shù)[%s],運(yùn)行時(shí)間是[%s]' %(func,stop_time-start_time))

8         return res

9     return wrapper

 使用裝飾器

 1 def cal(array):

2     res=0

3     for i in array:

4         res+=i

5     return res

7 cal=timer(cal)

8 cal(range(10))

 語(yǔ)法糖@

 1 @timer  #@timer就等同于cal=timer(cal)

2 def cal(array):

3     res=0

4     for i in array:

5         res+=i

6     return res

8 cal(range(10))

八 裝飾器應(yīng)用示例

 user_list=[

    {'name':'alex','passwd':'123'},

    {'name':'linhaifeng','passwd':'123'},

    {'name':'wupeiqi','passwd':'123'},

    {'name':'yuanhao','passwd':'123'},

]

current_user={'username':None,'login':False}

def auth_deco(func):

    def wrapper(*args,**kwargs):

        if current_user['username'] and current_user['login']:

            res=func(*args,**kwargs)

            return res

        username=input('用戶(hù)名: ').strip()

        passwd=input('密碼: ').strip()

        for index,user_dic in enumerate(user_list):

            if username == user_dic['name'] and passwd == user_dic['passwd']:

                current_user['username']=username

                current_user['login']=True

                res=func(*args,**kwargs)

                return res

                break

        else:

            print('用戶(hù)名或者密碼錯(cuò)誤,重新登錄')

    return wrapper

@auth_deco

def index():

    print('歡迎來(lái)到主頁(yè)面')

@auth_deco

def home():

    print('這里是你家')

def shopping_car():

    print('查看購(gòu)物車(chē)啊親')

def order():

    print('查看訂單啊親')

print(user_list)

# index()

print(user_list)

home()

 user_list=[

    {'name':'tom','passwd':'123'},

    {'name':'jack','passwd':'123'},

  ]

current_user={'username':None,'login':False}

def auth(auth_type='file'):

    def auth_deco(func):

        def wrapper(*args,**kwargs):

            if auth_type == 'file':

                if current_user['username'] and current_user['login']:

                    res=func(*args,**kwargs)

                    return res

                username=input('用戶(hù)名: ').strip()

                passwd=input('密碼: ').strip()

                for index,user_dic in enumerate(user_list):

                    if username == user_dic['name'] and passwd == user_dic['passwd']:

                        current_user['username']=username

                        current_user['login']=True

                        res=func(*args,**kwargs)

                        return res

                        break

                else:

                    print('用戶(hù)名或者密碼錯(cuò)誤,重新登錄')

            elif auth_type == 'ldap':

                print('auth')

                res=func(*args,**kwargs)

                return res

        return wrapper

    return auth_deco

#auth(auth_type='file')就是在運(yùn)行一個(gè)函數(shù),然后返回auth_deco,所以@auth(auth_type='file')

#就相當(dāng)于@auth_deco,只不過(guò)現(xiàn)在,我們的auth_deco作為一個(gè)閉包的應(yīng)用,外層的包auth給它留了一個(gè)auth_type='file'參數(shù)

@auth(auth_type='ldap')

def index():

    print('歡迎來(lái)到主頁(yè)面')

@auth(auth_type='ldap')

def home():

    print('home')

def shopping_car():

    print('shopping')

def order():

    print('check order')

# print(user_list)

index()

# print(user_list)

home()

感謝各位的閱讀,以上就是“Python中的裝飾器可以做什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python中的裝飾器可以做什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI