補充裝飾器

2021-07-27 20:09:08 字數 1265 閱讀 4560

1. 用functools.wraps隱藏包裝函式

先實現乙個簡單的裝飾器,過濾非負引數

def decorate(func):

def wrap(*args,**kwargs):

*****

return

return wrap

@myfilter

def test(*args):

print "args is %s" %args

可以發現,函式test的型別變成了包裝函式wrap

>>> test([1,0,-5,88])

args is [1, 88]

>>> test

如果想隱藏wrap,可以用functools.wraps

def myfilter(func):

@functools.wraps(func)

def wrap(*args):

return func(filter(lambda x:x>0,*args))

return wrap

非常方便,相當於用裝飾器的裝飾器

>>> test([1,0,-5,88])

args is [1, 88]

>>> test

2. 如果想要在裝飾器帶引數,使得裝飾器更靈活,把我乙個原則,先傳參,再傳型別,可以在外面加一層裝飾器

比如

def myfilter(outer):

def inner(func):

@functools.wraps(func)

def wrap(*args):

print "outer args is %s\n" %outer

return func(filter(lambda x:x>0,*args))

return wrap

return inner

呼叫的時候

@myfilter('outerl-value')

def test(*args):

print "args is %s" %args

>>> test([1,0,-5,88])

outer args is outerl-value

args is [1, 88]

裝飾器補充

一 通用裝飾器回顧 def inner args,kwargs 執行目標函式之前要執行的內容 ret func args,kwargs 執行目標函式之後要執行的內容 return ret return inner def target func print 我是目標函式 呼叫目標函式 二 函式的有用...

python 裝飾器 補充

在寫python類的時候,雖然可以通過 例項名.變數名 的方式對例項中的變數進行讀取和賦值。但出於規範性等等原因,我們最好還是寫getter和setter,使用property 函式和 property修飾符。第一種方法,使用property 函式 class person def init sel...

Python札記 裝飾器補充

本隨筆是對python札記 裝飾器的一些補充。使用裝飾器的時候,被裝飾函式的一些屬性會丟失,比如如下 usr bin env python def deco func print wrap start func print wrap end n deco def foo docstring for ...