函数与方法的装饰器,这些可以实现面向切面的编程,类似于java的spring中的proxy
#-*-coding:UTF-8-*-
#修饰器会默认接受一个对象,用来确保运行后将控制权返回给原来的函数,参数是一个function对象
def dec(func):
print '我是装饰器'
return func
def dec1(func):
print 'after'
class demo:
@dec
def fun1(self):
print '我是方法!'
demo().fun1()
对参数数量不确定的函数进行装饰
import pdb
pdb.set_trace()
def decorator(func):
def before(*args,**kwargs):
print 'before!'
func(*args,**kwargs)
print 'after!'
print args,kwargs
return before
@decorator
def foo(a,b=2):
print 'content'
if __name__ == '__main__':
foo(1,b=2)
让装饰器带参数
import pdb
pdb.set_trace()
def decorator(a):
def canshu(func):
def before(*args,**kwargs):
print 'before!'
func(*args,**kwargs)
print 'after!'
print args,kwargs,a
return before
return canshu
@decorator('123')
def foo(a,b=2):
print 'content'
if __name__ == '__main__':
foo(1,b=2)
与前面的不同在于:比上一层多了一层封装,先传递参数,再传递函数名。
def timer(b,d): #b,d为装饰器的参数
def m(a): #a是函数本身
def t(c): #c是函数的参数
print c
print d
print b
a('ccc')
return t
return m
@timer("this is the decorator's args",1)
def test(a):
print a
print 'main'
test("this is the function's args")