理解python装饰器

#-*- 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

#2014年08月11日20:33:50更新
#最后怎么为装饰器函数传递参数呢
#假设有一个函数adeco能返回itmeit5,adeco可以接受任意参数;就能实现为装饰器传递参数的功能
def adeco(arg):
    print 'input0 %s' % arg   #1
    def timeit5(func):
        print 'input1 %s' % arg    #2
        @functools.wraps(func) 
        def wrapper(*args,**kwargs):
            print 'input2 %s' % arg  #3
            start = time.clock() 
            ret = func(*args,**kwargs) 
            end = time.clock() 
            print 'used:',end-start 
            return ret 
        return wrapper
    return timeit5
#调用代参数的装饰器
@adeco('arg')  #相当于调用了adeco函数,那么#1 #2处的代码在定义是就执行了;只有#3处的代码是在运行是执行的,所以对arg的运算应该在wrapper函数中执行
def sub(x,y):
    return x-y
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值