想上面的函式執行用了多長時間,可通過下面的方式實現。(上面的time.sleep(1)是防止程式執行時間太短,列印時間時顯示為0)import time
def foo():
print('foo......')
time.sleep(1)
foo()
為了遵守開放封閉原則,我們將上述實現進行修改(尤其當需要計算時間的函式非常多時)。import time
def foo():
start = time.time()
print("foo......")
time.sleep(1)
end = time.time()
print("spend %s" %s (end-start))
foo()
上述實現方式的缺點時改變了函式呼叫方式,原來時呼叫bar(),現在時呼叫show_time(bar)。def bar():
print('bar……')
time.sleep(2)
def show_time(f):
start = time.time()
f()end = time.time()
print('spend %s' % (end-start))
show_time(bar)
上述**中的inner是乙個閉包函式。 當其他函式也需要計算時間時,假設該函式是bar(),只需要呼叫bar = show_time(bar)即可。import time
# 遵守開放封閉原則,對修改封閉,對擴充套件開放
def foo():
print('foo……')
time.sleep(2)
def show_time(f):
def inner():
start = time.time()
f()end = time.time()
print('spend %s' % (end - start))
return inner
foo = show_time(foo)
python提供了一種較為簡單的寫法:
將foo()函式放在show_time()函式下面,在foo()函式前加上@show_time,就可實現上述功能,@show_time的功能就相當於下面注釋掉的foo = show_time(foo)。其中show_time函式就是裝飾器函式。import time
# 遵守開放封閉原則,對修改封閉,對擴充套件開放
def show_time(f):
def inner():
start = time.time()
f()end = time.time()
print('spend %s' % (end - start))
return inner
@show_time
def foo():
print('foo……')
time.sleep(2)
# foo = show_time(foo)
被裝飾函式有引數時,引數是傳給了閉包函式,也就是上述**中的inner函式。
如果add()中的引數個數是不確定的,採用*a,**b的方式傳遞(下面**的**b實際上沒有接受到引數,引數全都傳到了a中)import time
# 遵守開放封閉原則,對修改封閉,對擴充套件開放
def show_time(f):
def inner(x, y):
start = time.time()
f(x, y)
end = time.time()
print('spend %s' % (end - start))
return inner
@show_time
def add(a, b):
print(a+b)
time.sleep(2)
add(1, 2)
裝飾器也可以加引數,巢狀的logger()的作用就是為了接收flag引數值。import time
# 遵守開放封閉原則,對修改封閉,對擴充套件開放
def show_time(f):
def inner(*x, **y):
start = time.time()
f(*x, **y)
end = time.time()
print('spend %s' % (end - start))
return inner
@show_time
def add(*a, **b):
sums = 0
for i in a:
sums += i
print(sums)
time.sleep(2)
add(1, 2, 5, 7)
import time
# 遵守開放封閉原則,對修改封閉,對擴充套件開放
# 裝飾器函式加引數
def logger(flag):
def show_time(f):
def inner(*x, **y):
start = time.time()
f(*x, **y)
end = time.time()
print('spend %s' % (end - start))
if flag == 'true':
print('日誌記錄 ')
return inner
return show_time
@logger(flag='true') # 返回show_time,相當於@show_time
def add(*a, **b):
sums = 0
for i in a:
sums += i
print(sums)
time.sleep(2)
add(1, 2, 5, 7)
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...
Python之裝飾器
裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...