Python中的裝飾器decorator

2021-07-06 11:01:15 字數 2847 閱讀 8579

本文是一篇讀書筆記,寫於一年多前。原文為: 本文只是對其中基礎和重要部分的選取與簡化。

1. 函式decorator的本質:

@one_decorator

def func():

pass

# 相當於

func = one_deacorator(func)

舉例:

def hello(fn):

print "hello, %s" % fn.__name__

fn()

print "goodbye, %s" % fn.__name__

@hello

def foo():

print "i am foo"

原先的foo函式被hello這個decorator包裹(wrap)了一層了。

故多個decorator其實是如下的轉換:

@decorator_one

@decorator_two

def func():

pass

# 相當於

func = decorator_one(decorator_two(func))

2. 帶引數的decorator:

@decorator(arg1, arg2)

def func():

pass

相當於 func = decorator(arg1,arg2)(func)

注意:這裡因為decorator(arg1,arg2)返回的是乙個類似函式指標的東西,也就是乙個函式,所以func就作為了這個函式的引數了。

3. class式的decorator

class mydecorator(object):

def __init__(self, fn):

print "inside mydecorator.__init__()"

self.fn = fn

def __call__(self):

self.fn()

print "inside mydecorator.__call__()"

@mydecorator

def afunction():

print "inside afunction()"

print "finished decorating afunction()"

afunction()

輸出:

inside mydecorator.__init__()

finished decorating afunction()

inside afunction()

inside mydecorator.__call__()

4. decorator的***

所以,python的functools包中提供了乙個叫wraps的decorator來消除這樣的***。

wraps的作用就是把原函式的函式名等屬性傳遞給decorator函式。

from functools import wraps

def hello(fn):

@wraps(fn)

print "hello, %s" % fn.__name__

fn()

print "goodbye, %s" % fn.__name__

@hello

def foo():

'''foo help doc'''

print "i am foo"

pass

foo()

print foo.__name__ #輸出 foo

print foo.__doc__ #輸出 foo help doc

5. 經典的例子

給函式呼叫做快取:

from functools import wraps

def memo(fn):

cache = {}

miss = object()

@wraps(fn)

result = cache.get(args, miss)

if result is miss:

result = fn(*args)

cache[args] = result

else:

print "hit cache! - %s" % args

return result

@memo

def fib(n):

if n < 2:

return n

return fib(n - 1) + fib(n - 2)

執行結果如下:

>>> execfile("1.py")

>>> fib(10)

hit cache! - 1

hit cache! - 2

hit cache! - 3

hit cache! - 4

hit cache! - 5

hit cache! - 6

hit cache! - 7

hit cache! - 8

55>>> fib(10)

hit cache! - 10

55>>> fib(8)

hit cache! - 8

21

python中的裝飾器

其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...

Python 中的裝飾器

1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...

python中的 裝飾器

示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...