1. 程式人生 > >python三大神器之一裝飾器

python三大神器之一裝飾器

裝飾器的作用:在不改變原函式的情況下給函式增加功能!

裝飾器由閉包和語法糖組成

閉包:即兩個函式巢狀,外部函式返回內部函式的引用,外部函式一定會傳入引數,外部函式起的是交換引用的作用:把要裝飾的引數(也就是裝飾前的函式)與 裝飾後的函式的引用對換,而裡層的函式做的是執行操作,呼叫原函式就是在這裡執行的!

#閉包模型
#外函式
def set_fun(func):
    def call_fun( *args, **kwargs):
#裡函式
#。。這裡可作為要執行原函式前執行的程式碼段,比如驗證功能。。
        result = func(*args, **kwargs)
#這裡可以對原函式的執行結果做篩選
        return result

    return call_fun

2.語法糖:

@set_fun # @這個就是語法糖,可以理解為:set_fun ===>test = set_fun(test)
def test():
    print("啦啦啦!我是要裝飾的原函式!^_^")

#下面說一種特殊三重灌飾器,也就是給裝飾器傳參
def set_args(args):
print("args%s"%str(args))


def set_fun(func):
print("set_fun")
def call_fun(*args,**kwargs):
print("call_fun")
return func(*args,**kwargs)
return call_fun
return set_fun




@set_args(123)  # 1.set_args(123) 2. @set_fun====>test = set_fun(test)
def test():
    print("test is show")


test()

裝飾器的應用場景很多:比如python裡的定義類方法和靜態方法就是用的裝飾器:

class A(object):
    
    @classmethod
    def show_a(self):
        pass
    
    @staticmethod
    def show_b():

        pass

還有就是Django與flask的網頁路由也是用的裝飾器的原理去實現:

@api.route('/send_sms_code',methods=["POST"])

    pass

下面說一下裝飾器在一種特殊的情況下:

我曾經在一個flask的專案的時候出現過一個異常,那時候我寫了一個裝飾器去處理多個檢視函式的效驗登陸狀態的問題,然後出現了一個異常:

AssertionError: View function mapping is overwriting an existing endpoint function: api_1_0.wraaper

這個異常出現的原因是因為一個模組下的多個檢視函式同時使用這個裝飾器,然後這幾個檢視函式之間的資料產生了互相影響,最後我用functools模組下的wraps去消除這種影響!

from functools import wraps
def login_required(view_func):
    """自定義裝飾器判斷登陸狀態
    使用裝飾器裝飾函式時,會修改被裝飾的函式的__name屬性和被裝飾的函式的說明文件
    為了不讓裝飾器影響被裝飾的函式的預設的資料,我們會使用@wraps裝飾器,提前對view_funcJ進行裝飾
    """
    @wraps(view_func)
    def wraaper(*args, **kwargs):
        """判斷使用者登入的邏輯"""
        user_id = session.get('user_id')
        if not user_id:
            return jsonify(code=RET.SESSIONERR, codermsg='使用者未登入')
        else:
            
            g.user_id = user_id
            # 執行被裝飾的檢視函式
            return view_func(*args, **kwargs)
    return wraaper

裝飾器我在很多第三方的原始碼裡都看到它的身影,它的強大可見一斑!

相關推薦

python三大神器之一裝飾

裝飾器的作用:在不改變原函式的情況下給函式增加功能!裝飾器由閉包和語法糖組成閉包:即兩個函式巢狀,外部函式返回內部函式的引用,外部函式一定會傳入引數,外部函式起的是交換引用的作用:把要裝飾的引數(也就是裝飾前的函式)與 裝飾後的函式的引用對換,而裡層的函式做的是執行操作,呼叫

Python三大神器裝飾

在之前的文章中寫了Python的生成器和迭代器,今天給大家分享一下關於裝飾器的一些知識。 閉包 在講裝飾器之前一定要提及的就是閉包,因為Python中的閉包是實現裝飾器的基礎。 # 定義一個函式 def test(number): # 在函式內部再定義一個

Python中的三大神器裝飾、迭代、生成器!你精通哪個?

裝飾器   以下示例是一個無參裝飾器,為原函式添加了統計執行時間的功能 import time #定義裝飾器 def timer(func): def wrapper(*args,**kwargs): start_time = time.time() res = f

python三大神器之'叠代'

次數 接收 依次 pan class 可叠代對象 認識 index urn 叠代器: 1.認識叠代器   叠代器是訪問集合元素的一種方式。叠代器是一個可以記住遍歷的位置的對象。叠代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。叠代器只能往前不會後退。   我

python第五章:三大利器(裝飾,叠代,生成器)--小白博客

博客 單點 comment ron () urn tro sequence 要求   叠代器是訪問集合元素的一種方式。叠代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。叠代器只能往前不會後退。 延遲計算或惰性求值 (Lazy evaluation)   

python函數下篇裝飾和閉包,外加作用域

發揮 作用域 fat 功能 user div 日誌 code 返回函數 裝飾器和閉包的基礎概念 裝飾器是一種設計模式能實現代碼重用,經常用於查日誌,性能測試,事務處理等,抽離函數大量不必的功能。 裝飾器:1、裝飾器本身是一個函數,用於裝飾其它函數:2、功能:增強被裝飾函數的

Python單元測試--使用裝飾實現測試跳過和預期故障

mar 標記 失敗 assertion 可能 -s dev https one Python單元測試unittest中提供了一下四種裝飾器實現測試跳過和預期故障。(使用Python 2.7.13) 請查考Python手冊中: https://docs.python.org

python閉包和裝飾(轉)

lee type ade 機制 並且 change -1 pri neu 一、python閉包 1、內嵌函數 >>> def func1(): ... print (‘func1 running...‘) ... def func2(

Python自學之樂-裝飾淺談

擴展性 func 可擴展性 函數調用 順序 簡單的 代碼 tar 統計 以前學過點 面向對象的知識,我感覺這之間是有關聯的,比如說裝飾器的第一個要素是對被裝飾的函數的封閉性,不允許更改;第二個就是對裝飾器本oj身的可擴展性。 裝飾器要點:高階函數+嵌套函數=裝飾器 需要掌握

Python學習之路-裝飾&生成器&正則表達式

python 生成器 裝飾器 正則表達式 裝飾器通俗的講,裝飾器就是在不改變源代碼基礎上,給源代碼增加新功能。不改變函數的源代碼、調用方式、返回值等,給函數增加新功能。經典案例:登錄裝飾器,def login_decorator(func): def inner():

Python--閉包與裝飾

python 閉包 裝飾器 閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域 #應用領域:延遲計算(原來我們是傳參,現在我們是包起來)from urllib.request import urlopen

python魔術方法之裝飾

裝飾器 描述器 三個魔術方法:__get__()__set__()__delete__()object.__get__(self,實例名,owner) #owner = 屬主 ,instance = 屬主類owner的實例object.__set__(self,實例名,value)object.

python 入坑路--裝飾(語法糖)--高高潮

wrapper else clas inpu 參數 index word com oca 上回我們說到,傳入的函數帶參數,這回我們要說的是,裝飾器帶參數,那麽裝飾器要如何是好。 1 u_n="keven" 2 passwd="abc123" 3 4 def au

Learn Python—函數(裝飾

結果 註釋 return rom 添加 body urn 簡單 裝飾器 裝飾器 開放封閉原則 開放:對函數的擴展是開放的 封閉:對函數的修改是封閉的 裝飾器的作用 在不更改原函數調用方式的前提下,對原函數添加新功能 # ①引子——為什麽要有裝飾器 為了在不修改原函數的基礎

python學習筆記(五):裝飾、生成器、內置函數、json

知識 我們 數列 ext 返回 utf choice 斐波拉契數列 不同 一、裝飾器 裝飾器,這個器就是函數的意思,連起來,就是裝飾函數,裝飾器本身也是一個函數,它的作用是用來給其他函數添加新功能,比如說,我以前寫了很多代碼,系統已經上線了,但是性能比較不好,現在想把程序裏

Python函數(八)-裝飾(一)

裝飾器 lee author brush light log 裝飾 true 源代碼 裝飾器通過函數來定義,用來裝飾函數 裝飾器不改變被裝飾函數的源代碼和運行方式 如何實現這個效果呢? # -*- coding:utf-8 -*- __author__ = "MuT6 S

Python函數(十)-裝飾(三)

進行 src def int 技術 put 功能 bubuko div 如果多個函數想通過一個裝飾器來實現不同的功能的話,可以給裝飾器傳入參數,讓裝飾器裏的函數對參數進行判斷,來實現不同的功能 # -*- coding:utf-8 -*- __author__ = "Mu

Python之旅:裝飾

解決 裝飾器 開放 擴展 nbsp 場景 應用場景 閉包 軟件 裝飾器就是閉包函數的一種應用場景 一、為何要用裝飾器 開放封閉原則:軟件一旦上線後,就應該遵循開放封閉原則,即對修改源代碼是封閉的,對功能的擴展是開放的       也就是說我們必須找到一種解決方

python閉包與裝飾

添加 war 返回值 AR set ret 功能 rgs 區別 閉包閉包:兩個函數的嵌套,外部函數返回內部函數的引用,外部函數一定有參數def 外部函數(參數):   def 內部函數():     pass return 內部函數 他跟函數之間的

Python閉包和裝飾

global col line AR bar lis 它的 class failed (1)python的LEGB: LEGB是指:按照L>E>G>B 的順序優先級進行變量查找。 L:local函數內部作用域,是最底層的單個函數