中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的裝飾器可以做什么

發布時間:2021-08-16 10:36:23 來源:億速云 閱讀:123 作者:chen 欄目:開發技術

這篇文章主要講解了“Python中的裝飾器可以做什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python中的裝飾器可以做什么”吧!

閱讀目錄

一 什么是裝飾器

二 裝飾器需要遵循的原則

三 實現裝飾器知識儲備

四 高階函數

五 函數嵌套

六 閉包

七 無參裝飾器

八 裝飾器應用示例

一 什么是裝飾器

器即函數

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

裝飾器定義:本質就是函數,功能是為其他函數添加新功能

二 裝飾器需要遵循的原則

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

2.為被裝飾函數添加新功能后,不修改被修飾函數的調用方式

三 實現裝飾器知識儲備

裝飾器=高階函數+函數嵌套+閉包

四 高階函數

高階函數定義:

1.函數接收的參數是一個函數名

2.函數的返回值是一個函數名

3.滿足上述條件任意一個,都可稱之為高階函數

 def foo():

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

def gao_jie1(func):

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

    func()

def gao_jie2(func):

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

    return func

gao_jie1(foo)

gao_jie2(foo)

 #高階函數應用1:把函數當做參數傳給高階函數

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    func()

    stop_time=time.time()

    print('函數%s 運行時間是%s' %(func,stop_time-start_time))

timmer(foo)

#總結:我們確實為函數foo增加了foo運行時間的功能,但是foo原來的執行方式是foo(),現在我們需要調用高階函數timmer(foo),改變了函數的調用方式

 #高階函數應用2:把函數名當做參數傳給高階函數,高階函數直接返回函數名

import time

def foo():

    print('from the foo')

def timmer(func):

    start_time=time.time()

    return func

    stop_time=time.time()

    print('函數%s 運行時間是%s' %(func,stop_time-start_time))

foo=timmer(foo)

foo()

#總結:我們確實沒有改變foo的調用方式,但是我們也沒有為foo增加任何新功能

 高階函數總結

1.函數接收的參數是一個函數名

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

  不足:會改變函數的調用方式

2.函數的返回值是一個函數名

  作用:不修改函數的調用方式

  不足:不能添加新功能

五 函數嵌套

  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 閉包:在一個作用域里放入定義變量,相當于打了一個包

 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')

七 無參裝飾器

無參裝飾器=高級函數+函數嵌套

基本框架

1 #這就是一個實現一個裝飾器最基本的架子

2 def timer(func):

3     def wrapper():

4         func()

5     return wrapper

加上參數

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('函數[%s],運行時間是[%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('函數[%s],運行時間是[%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))

 語法糖@

 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))

八 裝飾器應用示例

 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('用戶名: ').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('用戶名或者密碼錯誤,重新登錄')

    return wrapper

@auth_deco

def index():

    print('歡迎來到主頁面')

@auth_deco

def home():

    print('這里是你家')

def shopping_car():

    print('查看購物車啊親')

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('用戶名: ').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('用戶名或者密碼錯誤,重新登錄')

            elif auth_type == 'ldap':

                print('auth')

                res=func(*args,**kwargs)

                return res

        return wrapper

    return auth_deco

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

#就相當于@auth_deco,只不過現在,我們的auth_deco作為一個閉包的應用,外層的包auth給它留了一個auth_type='file'參數

@auth(auth_type='ldap')

def index():

    print('歡迎來到主頁面')

@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中的裝飾器可以做什么”的內容了,經過本文的學習后,相信大家對Python中的裝飾器可以做什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云浮市| 房山区| 湟源县| 新竹市| 柏乡县| 南宫市| 兴安县| 金华市| 宣化县| 长岛县| 阿图什市| 镇江市| 澄迈县| 祁东县| 关岭| 沧州市| 福鼎市| 合川市| 黄大仙区| 克山县| 上蔡县| 城固县| 岫岩| 云林县| 孟村| 抚顺县| 介休市| 博乐市| 晋宁县| 扶沟县| 慈溪市| 沙河市| 长顺县| 丰都县| 全南县| 汾西县| 昌宁县| 乌兰察布市| 根河市| 井冈山市| 额尔古纳市|