最新消息:

Python装饰器的理解

python admin 3442浏览 0评论

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

您必须 登录 才能发表评论!