装饰器

def document_it(func):
def new_function(*args, **kwargs):
print('Running function:', func.__name__)
print('Positional arguments:', args)
print('Keyword arguments:', kwargs)
result = func(*args, **kwargs)
print('Result:', result)
return result
return new_function #def add_ints(a, b):
# return a + b
#cooler_add_ints = document_it(add_ints)
#cooler_add_ints(3, 5)
#('Running function:', 'add_ints')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 8) #@document_it
#def add_ints(a, b):
# return a + b #add_ints(3, 5) def square_it(func):
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function #@square_it
#@document_it
#def add_ints(a, b):
# return a + b #add_ints(3, 5) #('Running function:', 'add_ints')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 8) @document_it
@square_it
def add_ints(a, b):
return a + b add_ints(3, 5) #('Running function:', 'new_function')
#('Positional arguments:', (3, 5))
#('Keyword arguments:', {})
#('Result:', 64) #靠近函数定义的装饰器最先执行
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper @log
def now():
print('2015-3-25') now() #call now():
#2015-3-25

如果decorator本身需要传入参数

def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator @log('execute')
def now():
print('2015-3-25') now() print(now.__name__) #execute now():
#2015-3-25
#wrapper

不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的

相当于:

now = log(now)
now = log('execute')(now)

最新文章

  1. 还有一个月,或者不到一个月就要期末了,复习ing
  2. C# 退出应用程序办法
  3. 【原】iOS学习41之多线程
  4. Android Edittext点击全选输入框内容
  5. Unix 进程通信基本概念
  6. 网络设备作用和工作ISO层
  7. pugixml使用教程
  8. ocx控件获取使用App的窗口句柄
  9. ReentrantLock源码分析与理解
  10. java7 新特性 总结版
  11. 用Python将一个列表分割成小列表
  12. java核心技术-(总结自杨晓峰-java核心技术36讲)
  13. 剑指offer(32)把数组排成最小的数
  14. Connect模块解析 转载
  15. maven之BOM及BOM和provided的一个小坑
  16. CSS 美化radio checkbox
  17. codis
  18. 【转】#pragma的用法
  19. 结对编程--四则运算(Java)梅进鹏 欧思良
  20. bzoj千题计划123:bzoj1027: [JSOI2007]合金

热门文章

  1. vue2.0 自定义 提示框(Toast)组件
  2. vue详细操作目录-基础篇
  3. C#基础系列:反射笔记
  4. apktool + eclipse 动态调试APK
  5. Spring注入service为null另类解决办法 工具类 一般类 静态 非controller
  6. Spring整合Hibernate的方法
  7. java手写单例模式
  8. yum 工作原理
  9. 稳定币GUSD的优劣势分析
  10. Linux就该这么学--命令集合6(打包压缩文件、文件查询搜索命令)