亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

誰能告訴我裝飾器的代碼執行邏輯

def log(f):

? ? ? ? def fn(*args, **kw):

? ? ? ? ? ? print 'call ' + f.__name__ + '()...'

? ? ? ? ? ??return f(*args, **kw)

? ? ? ? return fn

@log ?

def f(x,y):

? ? return x+y

print f(1,2)


這段代碼里,@log是一個高階函數,執行以后會先返回一個fn的函數對象,然后按照順序,不是應該再手動執行fn(),再執行f()嗎?為什么這段代碼里,直接print f(1,2)了,跳過了執行fn()這段,,求大神解答。

正在回答

2 回答

@log??

def f(x,y):

? ? return x+y

上面這段代碼的意思就是把原先f定義的函數覆蓋掉,讓它=fn定義的函數了

所以直接print f(1,2)相當于print fn(1,2)


1 回復 有任何疑惑可以回復我~
#1

糖醋里脊3229288 提問者

那fn這個函數,定義的時候,可不可以隨便起函數名,我試一下
2018-11-20 回復 有任何疑惑可以回復我~
#2

糖醋里脊3229288 提問者 回復 糖醋里脊3229288 提問者

可以隨便起名,昨天鉆牛角尖了,return f(*args, **kw)其實返回的是一個值,不是返回的函數,所以print f(1,2)調用fn以后就可以出結果了
2018-11-20 回復 有任何疑惑可以回復我~

@log 后,fn已經替換了原函數,@log相當于把fn這個新函數命名為原函數的名字,這樣就徹底隱藏了原函數

2 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
python進階
  • 參與學習       255563    人
  • 解答問題       3038    個

學習函數式、模塊和面向對象編程,掌握Python高級程序設計

進入課程

誰能告訴我裝飾器的代碼執行邏輯

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號