python之裝飾器

2021-10-04 05:46:03 字數 3080 閱讀 6131

import time

def foo():

print('foo......')

time.sleep(1)

foo()

想上面的函式執行用了多長時間,可通過下面的方式實現。(上面的time.sleep(1)是防止程式執行時間太短,列印時間時顯示為0)

import time

def foo():

start = time.time()

print("foo......")

time.sleep(1)

end = time.time()

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

foo()

為了遵守開放封閉原則,我們將上述實現進行修改(尤其當需要計算時間的函式非常多時)。

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)

上述實現方式的缺點時改變了函式呼叫方式,原來時呼叫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)

上述**中的inner是乙個閉包函式。 當其他函式也需要計算時間時,假設該函式是bar(),只需要呼叫bar = show_time(bar)即可。

python提供了一種較為簡單的寫法:

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)

將foo()函式放在show_time()函式下面,在foo()函式前加上@show_time,就可實現上述功能,@show_time的功能就相當於下面注釋掉的foo = show_time(foo)。其中show_time函式就是裝飾器函式。

被裝飾函式有引數時,引數是傳給了閉包函式,也就是上述**中的inner函式。

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)

如果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):

sums = 0

for i in a:

sums += i

print(sums)

time.sleep(2)

add(1, 2, 5, 7)

裝飾器也可以加引數,巢狀的logger()的作用就是為了接收flag引數值。

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...