装饰器案例由来例子

1、原始的foo函数功能

def foo():
  print 'in foo()'

foo()

================================================================================

2、现在需要增加print花费了多长时间,改写函数

import time

def foo():

  start = time.clock()
  print 'in foo()'

  end = time.clock()

    print "used ",end-start

foo()

 ================================================================================

3、第2个改变了原有函数,不变原函数内容

写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

  • 封闭:已实现的功能代码块
  • 开放:对扩展开发

如果将开放封闭原则应用在上述需求中,那么就不允许在原函数的内部进行修改代码

import time

def foo():
  print 'in foo()'

def timeit(func):
  start = time.clock()
  func()
  end =time.clock()
  print 'used:', end - start

timeit(foo)

 ================================================================================

4、第3个函数没变,但是调用变了,这里将调用也不变

#-*- coding: UTF-8 -*-
import time

def foo():
  print 'in foo()'

# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
  # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
  def wrapper():
    start = time.clock()
    func()
    end =time.clock()
    print 'used:', end - start
  # 将包装后的函数返回
  return wrapper

foo = timeit(foo)
foo()

 ================================================================================

5、使用python糖@timeit 取代 foo = timeit(foo)

import time

def timeit(func):
  def wrapper():
    start = time.clock()
    func()
    end =time.clock()
    print 'used:', end - start
  return wrapper

@timeit
def foo():
print 'in foo()'

foo()

 

原文地址:https://www.cnblogs.com/yycc/p/7240414.html