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 ...