装饰器把要装饰的方法作为输入参数,在被装饰的函数完成定义时候自动调用。
装饰器内部的方法只在被装饰的函数“首次调用”时执行(首次调用?也就是被装饰的函数完成定义时)。
装饰器只要返回一个可执行的函数就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装饰器的理解