目錄
閉包裝飾器
簡單裝飾器
修飾帶參函式的裝飾器
本身帶引數的裝飾器
類裝飾器
裝飾器缺點
裝飾器用途
說到裝飾器就不能忽略閉包,下面先介紹一下閉包的概念:在一些語言中,在函式中可以(巢狀)定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組「私有」變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。—— 維基百科
簡單來說,就是函式內部套函式,裡面的函式用到了外面函式的變數,然後把裡面的函式當作物件返回,比如下面的例子:
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個函式要新增相同的功能時,只需要呼叫已經寫過一次的修飾器就好 還有就是當你的程式很龐大時,想要給你的程式中的某個模組加上新的功能,不可能說直接修改源 因為說不定修...