Python之裝飾器

2021-09-24 11:28:04 字數 2949 閱讀 6242

為已存在的函式或物件新增額外的功能

裝飾器 = 高階函式 + 巢狀函式

函式名作為引數傳遞給裝飾器(@decorator_name)

裝飾函式返回函式名(函式位址)

預設情況下,裝飾器會修改名字和文件說明,但是可以使用functools

中 的@wraps()

解決。@wraps接受乙個函式來進行裝飾,並加入了複製函式名稱、注釋文件、引數列表等等的功能。這可以讓我們在裝飾器裡面訪問在裝飾之前的函式的屬性。

裝飾器作用於函式上,但是如果裝飾器裝飾在乙個類上面,相當於為類中的所有方法都加上了裝飾器

def decorator(func):

"""decorator __doc__

"""# @wraps(func)

func()

@decorator

def test():

"""test __doc__"""

time.sleep(0.5)

test(1, 2)

print("function name:", test.__name__)

print("function doc :", test.__doc__)

# output:

# 加了@wraps(func)後的output:

# function name: test

# function doc : test __doc__

此例子實現了乙個計算呼叫函式所占用的時間

import time

from functools import wraps

def decorator(func):

"""function:decorator

"""@wraps(func)

start = time.time()

ret = func(*args, **kwargs)

end = time.time()

print("function run time: ".format(func.__name__, end - start))

# print("function run time: ".format(fun=func.__name__, time=end - start))

return ret

@decorator

def test(a, b, name="lizo"):

"""function:test"""

time.sleep(0.5)

print(a, b, name)

為什麼可以使用類作為裝飾器?因為在python中,一切皆物件,其實函式也是乙個物件,如果乙個類實現了 __call__(self)

方法後,就可以像呼叫函式一樣,直接加乙個括號就可以呼叫。

class runtime:

def __init__(self):

pass

def __call__(self, func):

@wraps(func)

start = time.time()

ret = func(*args, **kwargs)

end = time.time()

print("function: run time: ".format(func=func.__name__, time=end - start))

return ret

#使用裝飾器方法1

runtime = runtime()

@runtime

def test_class_decorator1():

print("in the test_class_decorator")

time.sleep(0.2)

#使用裝飾器方法2

@runtime()

def test_class_decorator2():

print("in the test_class_decorator")

time.sleep(0.2)

class runtime:

def __init__(self, func):

self.func = func

def __call__(self, *args, **kwargs):

# @wraps(self.func)

start = time.time()

ret = self.func(*args, **kwargs)

end = time.time()

print("function: run time: ".format(func=self.func.__name__, time=end - start))

return ret

@runtime

def test_class_decorator1():

print("in the test_class_decorator")

time.sleep(0.2)

如果需要裝飾器接收引數,則需要新增一層函式

import time

from functools import wraps

def decorator(a):

def inner(func):

@wraps(func)

start = time.time()

ret = func(*args, **kwargs)

end = time.time()

print("function run time: ".format(func.__name__, end - start))

return ret

return inner

@decorator(a=1)

def test(a, b, name="lizo"):

pass

python裝飾器介紹 Python之裝飾器簡介

python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...

python 找到裝飾器 Python之裝飾器

裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...

Python之裝飾器

裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...