Python 兩種裝飾器

2022-09-19 04:39:13 字數 1692 閱讀 1696

目錄

帶引數的裝飾器(函式)

類裝飾器

裝飾器(decorators)是 python 的乙個重要部分。簡單地說:他們是修改其他函式的功能的函式。他們有助於讓我們的**更簡短,也更pythonic(python範兒)。 

來想想這個問題,難道@wraps不也是個裝飾器嗎?但是,它接收乙個引數,就像任何普通的函式能做的那樣。那麼,為什麼我們不也那樣做呢? 這是因為,當你使用@my_decorator語法時,你是在應用乙個以單個函式作為引數的乙個包裹函式。記住,python裡每個東西都是乙個物件,而且這包括函式!記住了這些,我們可以編寫一下能返回乙個包裹函式的函式。

在函式中嵌入裝飾器

我們回到日誌的例子,並建立乙個包裹函式,能讓我們指定乙個用於輸出的日誌檔案。

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

from functools import wraps

def logit(logfile='out.log'):

def logging_decorator(func):

@wraps(func)

log_string = func.__name__ + " was called"

print(log_string)

# 開啟logfile,並寫入內容

with open(logfile, 'a') as opened_file:

# 現在將日誌打到指定的logfile

opened_file.write(log_string + '\n')

return func(*args, **kwargs)

return logging_decorator

@logit()

def myfunc1():

pass

myfunc1()

# output: myfunc1 was called

# 現在乙個叫做 out.log 的檔案出現了,裡面的內容就是上面的字串

@logit(logfile='func2.log')

def myfunc2():

pass

myfunc2()

# output: myfunc2 was called

# 現在乙個叫做 func2.log 的檔案出現了,裡面的內容就是上面的字串

沒錯,裝飾器不僅可以是函式,還可以是類,相比函式裝飾器,類裝飾器具有靈活度大、高內聚、封裝性等優點。使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函式上時,就會呼叫此方法。

class foo(object):

def __init__(self, func):

self._func = func

def __call__(self):

print ('class decorator runing')

self._func()

print ('class decorator ending')

@foo

def bar():

print ('bar')

bar()

functools.wraps

python裝飾器兩種方式

1.普通裝飾器 def decorate fun 普通裝飾器 param fun return def inner args,kwargs print 呼叫裝飾器之前 fun args,kwargs print 呼叫裝飾器之後 return inner decorate method decorat...

python帶引數裝飾器的兩種寫法

前言 最近在實現乙個裝飾器的過程中發現了乙個很有意思的地方,在部落格裡面分享出來 不同的寫法 三層函式巢狀,實現了可傳引數的乙個裝飾器。import logging import functools deflogger msg none 日誌 defdector func functools.wra...

Python裝飾器的兩種使用心得

def decorator func def inner info print inner func info return inner decorator def show info info print info show info hello 裝飾器在裝飾函式的時候由於返回的是inner的函式...