誰能告訴我裝飾器的代碼執行邏輯
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()這段,,求大神解答。
2018-11-20
@log??
def f(x,y):
? ? return x+y
上面這段代碼的意思就是把原先f定義的函數覆蓋掉,讓它=fn定義的函數了
所以直接print f(1,2)相當于print fn(1,2)
2018-11-21
@log 后,fn已經替換了原函數,@log相當于把fn這個新函數命名為原函數的名字,這樣就徹底隱藏了原函數