Python装饰器用法实例分析


Posted in Python onJanuary 14, 2019

本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下:

无参数的装饰器

#coding=utf-8
def log(func):
  def wrapper():
    print 'before calling ',func.__name__
    func()
    print 'end calling ',func.__name__
  return wrapper
@log
def hello():
  print 'hello'
@log
def hello2(name):
  print 'hello',name
if __name__=='__main__':
  hello()

运行结果:

before calling  hello
hello
end calling  hello

带参数的装饰器:

#coding=utf-8
def log(func):
  def wrapper(name):
    print 'before calling ',func.__name__
    func(name)
    print 'end calling ',func.__name__
  return wrapper
@log
def hello(name):
  print 'hello',name
@log
def hello2(name):
  print 'hello',name
if __name__=='__main__':
  hello('haha')

运行结果:

before calling  hello
hello haha
end calling  hello

多个参数的时候:

#coding=utf-8
def log(func):
  '''
  *无名字的参数
  **有名字的参数
  :param func:
  :return:
  '''
  def wrapper(*args,**kvargs):
    print 'before calling ',func.__name__
    print 'args',args,'kvargs',kvargs
    func(*args,**kvargs)
    print 'end calling ',func.__name__
  return wrapper
@log
def hello(name,age):
  print 'hello',name,age
@log
def hello2(name):
  print 'hello',name
if __name__=='__main__':
  hello('haha',2)
  hello(name='hehe',age=3)

输出:

end calling  hello
before calling  hello
args () kvargs {'age': 3, 'name': 'hehe'}
hello hehe 3
end calling  hello

装饰器里带参数的情况

本质就是嵌套函数

#coding=utf-8
def log(level,*args,**kvargs):
  def inner(func):
    def wrapper(*args,**kvargs):
      print level,'before calling ',func.__name__
      print level,'args',args,'kvargs',kvargs
      func(*args,**kvargs)
      print level,'end calling ',func.__name__
    return wrapper
  return inner
@log(level='INFO')
def hello(name,age):
  print 'hello',name,age
@log
def hello2(name):
  print 'hello',name
if __name__=='__main__':
  hello('haha',2)

运行输出:

INFO before calling  hello
INFO args ('haha', 2) kvargs {}
hello haha 2
INFO end calling  hello

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python类方法__init__和__del__构造、析构过程分析
Mar 06 Python
基于tensorflow加载部分层的方法
Jul 26 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
Django MEDIA的配置及用法详解
Jul 25 Python
python cv2截取不规则区域图片实例
Dec 21 Python
pytorch 实现查看网络中的参数
Jan 06 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
Python字符串格式化f-string多种功能实现
May 07 Python
Python 实现简单的客户端认证
Jul 29 Python
如何在Anaconda中打开python自带idle
Sep 21 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
基于Python实现将列表数据生成折线图
Mar 23 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 #Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 #Python
对Python多线程读写文件加锁的实例详解
Jan 14 #Python
Python多进程写入同一文件的方法
Jan 14 #Python
python 将大文件切分为多个小文件的实例
Jan 14 #Python
使用k8s部署Django项目的方法步骤
Jan 14 #Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 #Python
You might like
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
python3简单实现微信爬虫
2015/04/09 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
python爬虫的工作原理
2017/03/05 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python如何实现线程间通信
2020/07/30 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
介绍一下JNDI的基本概念
2013/07/26 面试题
军训口号
2014/06/13 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书