91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

python裝飾器

發布時間:2020-07-12 09:30:36 來源:網絡 閱讀:463 作者:Forande 欄目:編程語言

裝飾器原理:
????裝飾器是為了在不改變原函數的功能的同時給原函數增加一些新功能的函數叫做裝飾器。


首先說一下簡單的裝飾器原理

def?aa():
????print('我就是一個簡單的函數')

我們如果再不改變這個函數的基礎上添加一個新功能該怎么做?

我們只需要添加一個新函數來調用這個函數,然后在形函數上添加新功能就好了,例如

def?decorate(fn):
????def?inner():
????????print('這個是新加功能')
????????return?fn
????return?inner()

def?aa():
????print('我就是一個簡單的函數')

aa?=?decorate(aa)
aa()

輸出結果為:

這個是新加功能
我就是一個簡單的函數



下面就看看更詳細一點的裝飾器

直接上代碼,查看結果

def?decorate(func):
????def?inner(a,b):
????????print('3?給函數添加一個求和的輸出?{}?{}'.format(a,b))
????????print('4?我要打印func函數',?func)
????????result?=?func(a,b)
????????print('6?我要打印add函數',?add)
????????print('7?我要打印func函數',?func)
????????print('8?我要打印inner函數',?inner)
????????return?result
????print('2?我要打印decorate函數',decorate)
????return?inner

@decorate
def?add(a,b):
????print('5?我要打印add函數',?add)
????return?a+b
print('1?我應該是首個打印的')
print('9?這是函數輸出的結果',add(1,2))

輸出結果為:

2?我要打印decorate函數?decorate
1?我應該是首個打印的
3?給函數添加一個求和的輸出?1?2
4?我要打印func函數?add
5?我要打印add函數?inner
6?我要打印add函數?inner
7?我要打印func函數?add
8?我要打印inner函數?inner
2?我要打印decorate函數?decorate
9?這是函數輸出的結果?3


過程分析

由上面的輸出,我們可以看得出來,裝飾器的執行順序是,213456789;
那是因為@裝飾器函數,然后相當于把函數add傳給了裝飾器,從而變成了add = decorate(add),這里調用了decorate函數把函數add傳到了
裝飾器內部,然后就打印了第二步,由于沒有后續的調用,程序就在這里在inner處停滯等待被調用,而inner的實際指針已經指向了add函數
所以打我們打印func的時候輸出的是add函數,并沒有帶locals,這里就不屬于decorate的內部函數,而我們裝飾器下面的add函數卻已經成
為了inner的內部函數了,接下來的邏輯就是正常的函數執行邏輯了
#裝飾器過程
@decorare+add --》decorate--》inner--》result=func 即 result=add--》
#調用過程
(新add)add(1,2)--》result(1,2)--》(被裝飾函數add)add(1,2)--》輸出結果
但是經過了裝飾器這兩個add只是同名而已


向AI問一下細節

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

AI

阳原县| 昆明市| 霍城县| 宁河县| 施秉县| 汽车| 塘沽区| 沛县| 怀宁县| 仪征市| 鹰潭市| 南通市| 苏尼特右旗| 嵊泗县| 安远县| 丰宁| 平谷区| 雅安市| 庆云县| 板桥市| 阆中市| 黎城县| 琼结县| 南昌县| 宁陕县| 明星| 宁海县| 利川市| 天柱县| 深水埗区| 分宜县| 民权县| 扶沟县| 自治县| 曲松县| 柞水县| 合水县| 麟游县| 宜州市| 获嘉县| 扶余县|