python中的裝飾器詳解

2022-10-04 23:15:24 字數 2982 閱讀 3030

在了解裝飾器的之前一定要先了解函式作為引數傳遞, 什麼是函式內嵌,請參考我之前寫的部落格函式簡介

因為在python裡面,函式也是物件,也可以作為引數進行傳遞.python裝飾器本質也是一種特殊函式,它接收的引數是函式物件,然後動態地函式引數新增額外的功能,而不用修改原有的函式物件.python裝飾器傳入的引數是函式,返回的值也是函式!

python裝飾器思想有點類似設計模式的裝飾模式, 其意圖是動態地給函式物件新增額外的功能.比如像增加日誌列印的功能,有點面向切面程式設計(aop)的感覺.

裝飾器語法

以@開頭,接著後面跟著的是裝飾器的名字和可選的引數.裝飾器語法是一種語法糖.

格式如下

複製** **如下:

@decomaker(deco_args)

def foo(func_opt_args)

可以組合,等價於foo = g(f(foo))

複製** **如下:

@g@f

def foo():

statement

簡單裝飾器例項

複製** **如下:

#!/usr/bin/python

def  deco(func):

print 'start'

func()

print 'end'

return func

@deco

def foo():

print 'in foo'

foo()

foo()

輸出複製程式設計客棧** **如下:

start

in foo

endin foo

in foo

帶內嵌函式裝飾器內嵌函式保證每次新函式都被呼叫.而且被裝飾的函式可以帶有引數.

例項複製** **如下:

def  deco(func):

def ptbtvwg_deco(x):    #該函式為內嵌函ptbtvwg數

print 'start'

func(x)

print 'end'

return _deco

@deco

def foo(x):

print 'in foo, get value is: %d' % x

foo(123456)

輸出:複製** **如下:

start

in foo, get value is: 123456

end帶引數的裝飾器需要自己返回以函式作為引數的裝飾器。換句話說,decomaker()用 deco_args 做了些事並返回函式物件,而該函式物件正是以 foo 作為其引數的裝飾器。簡單的說來:foo=decomaker(deco_args)(foo)

例項複製** **如下:

def deco(arg):

def wrapper1(func):

def _deco(x):

print "get type is: ", arg

func(x)

return _deco

def wrapper2(func):

def _deco(x):

func(x)

&nbptbtvwgsp;        print "get type is: ", arg

return _deco

if arg == 'type1':

return wrapper1

else:

return wrapper2

@deco("type2")

def foo(x):

print 'in foo: ', x

foo(123)

輸出複製** **如下:

in foo:  123

get type is:  type2

總結裝飾器本質是高階的函式,可以裝飾其他函式,增加被裝飾函式的功能,但不能覆蓋或改變被裝飾函式原有的行為.對於被裝飾的函式來說,裝飾器是透明的.裝飾器傳入引數為函式,返回的函式是被裝飾的函式.最後我們來實現給乙個函式新增列印日誌的功能,而不用改變這個函式.

複製** **如下:

#!/usr/bin/python

#coding=utf-8

import functools

def log(prefix, suffix):

def deco(func):

@functools.wraps(func)

def wrapper(*args, **kargs):

print '%s log start' % prefix

print('get a is: %s' % args[0])

print('get b is: %s' % args[1])

print('get c is: %s' % args[2])

tbtvwgp;    print('get d is: %s' % kargs['d'])

print('get d is: %s' % kargs['f'])

func(*args, **kargs)

print '%s log end' % suffix

return wrapper

return deco

@log('logstart', 'logend')

def test(a, b, c, d, f):

print 'call func name is: %s' % test.__name__

test(1, 2, 3, d = 'dddd', f = 'ffff')

輸出:複製** **如下:

logstart log start

get a is: 1

get b is: 2

get c is: 3

get d is: dddd

get d is: ffff

call func name is: test

logend log end

本文標題: python中的裝飾器詳解

本文位址:

Python中的裝飾器詳解

1.裝飾器介紹 2.語法糖 3.裝飾器的應用 4.多個裝飾器的使用 1.裝飾器介紹 裝飾器就是對被裝飾的物件 類,函式 進行重構的,可以在不改變原來物件的情況下呼叫物件時執行重構的行為,在不改變原函式的基礎上,給函式增加功能。特點 把乙個函式當作引數,返回乙個替代版的函式,本質就是乙個返回函式的函式...

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...