装饰器把要装饰的方法作为输入参数,在被装饰的函数完成定义时候自动调用。
装饰器内部的方法只在被装饰的函数“首次调用”时执行(首次调用?也就是被装饰的函数完成定义时)。
装饰器只要返回一个可执行的函数就ok,这个函数可以是被装饰的函数原型,也可以是经过修改后的它。
#-*- coding: UTF-8 -*- import time import functools def foo(say,hi='xx'): print locals() print 'in foo :say %s' % (say,) def add(x,y): return x+y #version 1 def timeit(func): start = time.clock() func() end = time.clock() print 'used:',end-start #如果不改变foo的调用方式就需要 #foo = timeit(foo) #version 2 def timeit2(func): def wrapper(): start = time.clock() func() end = time.clock() print 'used:',end-start return wrapper #需要考虑参数的问题 #version 3 def timeit3(func): def wrapper(*args,**kwargs): start = time.clock() func(*args,**kwargs) end = time.clock() print 'used:',end-start return wrapper #返回值 def timeit4(func): def wrapper(*args,**kwargs): start = time.clock() ret = func(*args,**kwargs) end = time.clock() print 'used:',end-start return ret return wrapper #让调用也方便 @timeit4 def sub(x,y): return x-y #当我们使用sub.__name__的时候返回的是什么呢? #'wrapper' #这个明显不是我们需要的,functools.wraps就是来解决这个问题的 def timeit5(func): @functools.wraps(func) def wrapper(*args,**kwargs): start = time.clock() ret = func(*args,**kwargs) end = time.clock() print 'used:',end-start return ret return wrapper @timeit5 def sub2(x,y): return x-y
#coding=utf-8 import os,sys def FirstDeco(func): print "exec on the first time" #test函数完成定义时调用,也是唯一一次调用 def shit(param1,param2): print "exec everytime" return func(param2) return shit @FirstDeco def test(arg): print arg if __name__=='__main__': print "------------" test("aaa",'b') print "------------" test("bbb",'c')
调用test时,实际是调用shit函数,参数也必须跟shit函数的参数一致。
在shit函数内部执行的func函数才是真正的test函数。
#coding=utf-8 import os,sys def retry_func(func): def new_function(*args,**kargs): print 'first time' func(*args,**kargs) print 'second time' func(*args,**kargs) return new_function @retry_func def do_some(msg): print 'say:',msg
1. Python装饰器学习 入门 http://www.aikaiyuan.com/6549.html
2. Python装饰器学习 http://www.aikaiyuan.com/6550.html
3. Python装饰器与面向切面编程 http://www.aikaiyuan.com/6551.html
4. Python装饰器的理解 http://www.aikaiyuan.com/6552.html
5. Python装饰器 http://www.aikaiyuan.com/6553.html
转载请注明:爱开源 » Python装饰器的理解