Python 裝飾器總結

2021-09-25 20:06:39 字數 2743 閱讀 9138

目錄

閉包裝飾器

簡單裝飾器

修飾帶參函式的裝飾器

本身帶引數的裝飾器

類裝飾器

裝飾器缺點

裝飾器用途

說到裝飾器就不能忽略閉包,下面先介紹一下閉包的概念:

在一些語言中,在函式中可以(巢狀)定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組「私有」變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。—— 維基百科

簡單來說,就是函式內部套函式,裡面的函式用到了外面函式的變數,然後把裡面的函式當作物件返回,比如下面的例子:

def outer(msg):

def iner():

print msg # msg是外部函式的變數(外部變數)

return printer # 返回的是函式,同時延長了外部變數的生命週期

printer = outer('test')

printer()

上面這個例子展示了基本的閉包,同時閉包也可以下面這樣用:

def adder(x):

return x + y

adder5 = adder(5)

# 輸出 15

adder5(10)

# 輸出 11

adder5(6)

這時我們避免了使用全域性變數,使得外部函式的引數x的生命週期得到延長。

裝飾器其實就是由閉包實現的,下面給出幾種不同的裝飾器:

def outer(func):

logging.warn("%s is running" % func.__name__)

return func()

@outer

def foo():

print("hello world")

foo()

def outer(func):

if level == "warn":

logging.warn("%s is running" % func.__name__)

elif level == "info":

logging.info("%s is running" % func.__name__)

return func(*args)

return decorator

@outer

def foo(name):

print("hello world %s" % name)

foo('silly b')

def outer(level):

def decorator(func):

if level == "warn":

logging.warn("%s is running" % func.__name__)

elif level == "info":

logging.info("%s is running" % func.__name__)

return func(*args)

return decorator

@outer(level="warn")

def foo(name):

print("hello world %s" % name)

foo(『silly b』)

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()

使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函式上時,就會呼叫此方法。

@a

@b@c

def f ():

pass

# 呼叫順序從下到上,c——b——a:

f = a(b(c(f)))

from functools import wraps

def logged(func):

@wraps(func)

def with_logging(*args, **kwargs):

print func.__name__ # 輸出 'f'

print func.__doc__ # 輸出 'does some math'

return func(*args, **kwargs)

return with_logging

@logged

def f(x):

"""does some math"""

return x + x * x

注入引數(提供預設引數,生成引數)

記錄函式行為(日誌、快取、計時等功能)

預處理/後處理(配置上下文)

修改呼叫時的上下文(執行緒非同步或者並行,類方法)

Python 裝飾器總結

目錄閉包 裝飾器簡單裝飾器 修飾帶參函式的裝飾器 本身帶引數的裝飾器 類裝飾器 裝飾器缺點 裝飾器用途 說到裝飾器就不能忽略閉包,下面先介紹一下閉包的概念 在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變...

Python 裝飾器歸納總結

實際應用中裝飾器沒少用,像flask的路由功能,都是用裝飾器來掛上去的,不過平時裝飾器都是看的網上的文章然後在用,自己沒總結過 這次單獨寫一篇筆記,加深印象 先簡單講一下我理解的裝飾器的兩大特點 1 在不用修改原本函式的情況下,對原來函式的輸出結果進行新增功能 2 裝飾器是乙個高階函式,他的返回值,...

python 裝飾器 學習總結

有點類似函式的目的 函式的目的就是當你有1w個 塊要新增相同的功能時,只需要呼叫已經寫過一次的函式就好,而不是要寫1w次同樣的 當你有1w個函式要新增相同的功能時,只需要呼叫已經寫過一次的修飾器就好 還有就是當你的程式很龐大時,想要給你的程式中的某個模組加上新的功能,不可能說直接修改源 因為說不定修...