python3函式的裝飾器

2021-10-06 13:55:26 字數 1701 閱讀 9572

裝飾器顧名思義就是包裝,把函式包裝一下我們可以做什麼呢,我們可以在目標函式呼叫的前中後做一些事情,比如我們要統計乙個函式的執行時間,

def p():

print('hello world')

要統計函式p的執行時間,最直接的是直接在函式體修改,新增時間計算邏輯:

import time

def p(name):

start = time.time()

print('hello %s'%name)

end = time.time()

print('spend time is %s'%(end-start))

如果其他函式也要統計消耗時間,那其他函式同樣需要新增重複的時間計算邏輯,原本與業務無關的邏輯侵入到了業務**裡,**重複冗餘且很難擴充套件,公共部分難以重用,

倘若再新增其他諸如日誌統計,那麼**每次都需要重構,最簡單的我們可以將公共部分抽取出乙個函式:

import time

def show_time(func):

start = time.time()

func()

end = time.time()

print('spend time is %s'%(end-start))

show_time(p)

這樣我們將目標函式傳入到公共函式,就可以統計目標函式的執行時間了,但是目標函式需要顯式呼叫公共函式,而且公共函式暴漏在外面,況且目標函式引數傳遞不靈活,

那麼我們就可以用python的裝飾器了,將函式目標函式包裝一下:

import time

def show_time(func):

def proxy(*args,**kargs):

start=time.time()

print(args)

print(kargs)

func(args)

end=time.time()

print('spend %s'%(end-start))

return proxy

@show_time

def test(name):

print(name)

time.sleep(3)

是不是感覺有點像**模式,這就是面向切面的程式設計,需要抽象一把,python函式使用裝飾器可以無縫的將切面織入到業務邏輯裡,這樣就完成了切面的工作。

人生苦短,我用python。

python3 深入裝飾器

def outer c def inner uname print 我是 end c uname return inner outer def fun 1 uname print f 北京的 fun 1 mike def outer c def inner args,kwargs 通用的形參的設定 ...

Python3 高階 裝飾器

1.裝飾器功能 在不修改原函式的情況下,增強函式功能 2.不帶引數的函式 不帶引數的裝飾器 1 foo 被裝飾的函式 2 show time 是裝飾器 coding utf 8 import time def show time func def inner start time time.time...

python3裝飾器 高階

作用 優化裝飾器 from functools import wraps 匯入wraps def wraps f wraps的語法糖 def inner args,kwargs ret f args,kwargs return ret return inner deff1 print hello,w...