1. 程式人生 > >正確理解裝飾器

正確理解裝飾器

先看一段小例子簡單理解下什麼是裝飾器

定義三個函式, w1函式內定義一個內部函式,w1函式的返回值是一個函式名

def w1(Func):
    def inner():
        print("----------驗證------------")
        Func()
    return inner

def f1():
    print("---------f1----------")

def f2():
    print("----------f2----------")

test = w1( f1 )
test()
這相當於將f1函式傳遞給w1返回一個函式名,用test接收,也相當於test指向inner函式 test()就相當於呼叫這個inner函式所以執行完結果是

print("----------驗證------------")
print("---------f1----------")

但是這樣寫雖然可以,但是有時候因業務需要可能還不滿足需求我們可以將test換成 f1
f1 = w1( f1 )
f1()
這樣我們呼叫起來就比較方便了。

但是這裡我們又提出新的要求了,python 裡面有沒有更便捷的方法能,肯定是有的。
我們直接在f1 和 f2 函式前加上一個裝飾器也就是

def w1(Func):
    def inner():
        print("----------驗證------------"
) Func() return inner @w1 def f1(): print("---------f1----------") @w1 def f2(): print("----------f2----------")

經測試結果是一樣的
f1()
f2()
打印出來的結果為:

print("----------驗證------------")
print("---------f1----------")
print("----------驗證------------")
print("---------f2----------"
)

以上是裝飾器最簡單的一部分應用

多個裝飾器

def makeBold( fn ):
    def wrapped():
        print("-----1------")
        return "<b>"+fn()+"</b>"

def makeItalic( fn ):
    def wrapped():
        print("------2------")
        return "<i>"+fn()+"</i>"

@makeBold
@makeItalic
def test3()
    print("------3-----")
    return "hello world 3"

ret = test3()
print(ret)
執行完後結果為:

------1------
------2------
------3------
<b><li>hello world 3</li></b>

附一張前輩們解釋的詳圖
這裡寫圖片描述

這裡有兩個裝飾器,當程式執行到@makeBold的時候,當是識別到下面還有裝飾器的時候。這個裝飾器就會等待下面的裝飾器完成後再執行。也就是先執行@makeItalic,先將test3函式作為引數傳遞給makeBold(),也就是
t1 = makeItalic(test3),這個裝飾器執行到這裡的時候makeBold開始起作用,有相當於
這裡的 t1也就是makeItalic中的wrapped()這個函式
t1 = makeBold( t1 )相當於t1 = makeBold( wrapped )
之後再執行t1()也就是
最後執行也就是從外面一層一層的執行,t1() 也就是makeBold()中的wrapped()這個函式所以先列印1 執行到”<b>+fn()+”</b>”時候 fn()實際上是makeItalic中的wrapped()這個函式,而這個函式中的fn()又是test3()所以一步步執行下來就是上面的結果

相關推薦

正確理解裝飾

先看一段小例子簡單理解下什麼是裝飾器 定義三個函式, w1函式內定義一個內部函式,w1函式的返回值是一個函式名 def w1(Func): def inner():

一個理解裝飾很好的例子

啥也不說了,直接看圖: 另外符文函式學習內容: #把foo1看成一個變數,指向函式物件 def foo1(num): return num+1 print (foo1(3)) #foo2指向另外一個函式 def bar(): return 'Bar'

python中如何理解裝飾

看了一些文章,終於理解裝飾器了,實現的功能可認為是給函式新增某項功能,而不改變函式。 舉例如下: 然後想在其中加入某個功能,好比在print出“這是裝飾器” 可以通過裝飾器實現 如上圖,先定義一

一個例子理解裝飾模式

什麼是裝飾器模式? 有些時候,我們希望為一個類新增一些功能,同時又不希望改變這個類原來的結構。 例如:我已經完成了一個日誌的介面和它的各個實現類,但是這些類只有輸出日誌到不同地方的功能,LoggerFileSystem能將日誌輸出到檔案系統(磁碟)中,Log

簡單例子理解裝飾

python中的裝飾器可謂極其神祕,雖然常聽到,使用裝飾器會讓程式碼如虎添翼,網上更是用內褲外面加長褲來形象的解釋裝飾器,但我硬是看了很多次都不得要領。 但我不能就這麼放棄啊,終於還是搞明白了點點,雖然不全面,但也算對裝飾器有了初步的瞭解吧。 先上一個簡單的例子: #!/u

設計模式之簡單理解裝飾模式與運用

1.什麼是裝飾器模式 ​ 裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。 ​ 這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。 2、裝飾器模

如何正確理解關鍵字"with"與上下文管理(轉載)

name self 限制 ioerror mysql ops tput 可能 簡化   如果你有閱讀源碼的習慣,可能會看到一些優秀的代碼經常出現帶有 “with” 關鍵字的語句,它通常用在什麽場景呢?今天就來說說 with 和 上下文管理器。   

python中裝飾你真的理解嗎?

步驟 strong class ron 執行 裝飾器 code ... .... def w1(func): print(‘裝飾器1....‘) def w1_in(): print(‘w1_in.....‘) func()

對Python中裝飾(Decorator)的理解與進階

python decorator 裝飾器 有時候我們項目中的某些功能做些修改即需要對內部的某些函數添加一些附加功能,但是為了安全起見不想改變函數的源代碼以及函數的調用方式,那麽裝飾器在這個地方會給我們帶來很大的幫助。 裝飾器(Decorator):(又叫語法糖) 定義:本質是函數,功能(裝

python登錄加隨機驗證碼校驗程序(裝飾內置函數的理解

python 裝飾器 內置函數 登錄驗證 驗證碼使用說明:為了防止惡意攻擊,同時不對原先用戶登錄驗證的方法代碼進行改動,在檢驗賬號密碼方法外再套一層校驗方法(驗證碼),過濾非人為的攻擊。代碼如下:#!/usr/bin/env python # -*- coding:utf-8 -*- import os im

python入門基礎-函數裝飾理解

不改變 函數名 result 原本 都沒有 而且 升級 結束 log 1.裝飾器 # 知乎某大神是這麽比喻裝飾器的:內褲可以用來遮羞,但是到了冬天他就沒有辦法為我們禦寒,聰明的人於是發明了長褲,有了長褲後寶寶再也不冷了, # 裝飾器就像我們這裏說的長褲,在不影響內褲作用的

Python裝飾的通俗理解

python 裝飾器 python裝飾器 在學習Python的過程中,我相信有很多人和我一樣,對Python的裝飾器一直覺得很困惑,我也是困惑了好久,並通過思考和查閱才能略有領悟,我希望以下的內容會對你有幫助,我也努力通過通俗的方式使得對Python裝飾器的理解更加的透徹,很多人對裝飾器難以理解,

Python裝飾理解

python裝飾器 高階函數 out 發現 分享 打印 內部 存儲 -i 本文介紹Python其中一個強大的功能--裝飾器 裝飾器本質上就是一個函數,在不修改源代碼,調用方法的前提下,用來給其他函數添加功能的函數 想象一下,你已經開發完成一個功能,並且投入應用中,卻發

python入門(六)裝飾理解

裝飾器裝飾器用於拓展原有函數功能的一種函數比如: def helloWorld(fun) def out() print ("======start========") fun() print ("

理解python中的裝飾

python 裝飾器 一 什麽是裝飾器? 正如其名,裝飾器的作用是為已經存在的對象增加額外功能(裝飾),由此可使已有函數在無需代碼改動的情況下增加額外功能;裝飾器的本質是嵌套的函數且返回函數對象,即閉包。有關閉包的概念,可參考《理解Python中的閉包》一文。二 裝飾器應用場景舉例

如何理解python裝飾

() 如何 lee 簡單的 存在 port print pytho -s 如何理解裝飾器python 學習遇到的第一個難點是裝飾器。裝飾器的作用是不大規模改動代碼的情況下,增加功能。作用:為已經存在的對象添加額外的功能特點:不需要對對象做任何的代碼上的變動。以一個例子來講裝

關於閉包即雙層裝飾理解

多層裝飾器 技術 14. mage 作用 成了 概念 http 全局 ** 閉包**:就是一個概念,出現在嵌套函數中,指的是內層函數引用到了外層函數的**自由變量**(未在本地作用域中定義的局部變量),就形成了閉包。 函數的局部作用域是不能夠保存信息的,即在函數內部聲明

Python 裝飾理解與使用

Python裝飾器 本質是函式 為其他函式新增附加功能。裝飾器本身也是Python的一個重點,所以無論如何你必須弄懂它。裝飾器的存在其實就是為了在需要新增新功能時不影響之前版本的使用的同時來增加新功能,其實也是一種“偷懶”的辦法。它的使用場景較多,比如:插入日誌、效能測試、事務處理、快取

python函數語言程式設計3(裝飾的深入理解)

一、什麼是裝飾器 1、python中裝飾器可以理解為AOP程式設計,有點類似Spring中的註解,在不改變原函式或類的基礎上,對函式或類新增額外(自己需求補充)的功能。 2、裝飾器本質上是一個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改程式碼的前提下增加額外的功能,裝飾器的返回值也是

python中裝飾的簡單理解

裝飾器 裝飾器也屬於閉包的一種 #裝飾器是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、效能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函式中與函式功能本身無關的雷同程式碼並繼續重用。概括的講,裝飾器的作用就是為