python装饰器相当于函数的调用方式


Posted in Python onDecember 27, 2019

1. 普通装饰器

import logging
 
 1. foo = use_loggine(foo)
 def use_loggine(func):
 def wrapper():
  logging.warn("%s is running " % func.__name__)
  return func()
 return wrapper
 
 @use_loggine
 def foo():
 print "aaa"
 foo()
 print foo.__name__

2. func 需要参数:

foo = use_loggine(foo) 第一个参数就是func这个函数对象,不包含参数foo(params)

 def use_loggine(func):
 def wrapper(name):
  logging.warn("%s is running " % func.__name__)
  return func(name)
 return wrapper
 
 
 @use_loggine
 def foo(name):
 print "name is %s" % name

3. 装饰器带参数

foo = use_logging('warn')(foo) 还是把被装饰的函数当做参数赋给装饰器

 def use_logging(level):
 def decorator(func):
 def wrapper(*args, **kwargs):
  if level == 'warn':
  logging.warn("%s is running" % func.__name__)
  elif level == 'info':
  logging.warn("%s is running" % func.__name__)
  return func(*args)
 return wrapper
 return decorator
 
 @use_logging('warn')
 def foo(name):
 print "i am %s" % name
 
 foo = use_logging('warn')(foo)
 print foo.__name__
 foo('foo')

4. 类装饰器,还是把被装饰的函数当做参数赋给装饰器

foo = Foo(params)(func)
 
 class Foo(object):
 def __init__(self, name):
 self.name = name
 
 def __call__(self, func):
 def aa():
  print "class decorator running"
  print "name is :%s" % self.name
  func()
  print 'class decorator ending'
 return aa

 @Foo("hello")
 def bar():
 print "world"
 
 bar()
 
 @deco
 def foo()
 pass
 
 foo = deco(foo)
 
 @deco(xx)
 def foo():
 pass
 
 foo = deco(xx)(foo)

5. 类方法装饰器

类方法装饰器和其他装饰器没有什么区别,只不过在装饰器内部返回的函数中,第一个参数是固定的,是调用方法的对象本身,如

果是实例对象,就是self,是类方法的话,就是cls,静态方法的话,没有第一个参数。

from functools import wraps

 
 def method_decor(func):
 @wraps(func)
 def wrapper(*args, **kwargs):
  try:
  u = func(*args, **kwargs)
  return u
  except Exception as e:
  args[0].bb() # args[0]就是self或者cls。可以在args前面定义self,更加方便u = func(self,*args, **kwargs)
  return 'an Exception raised.'
 
 return wrapper
 
 
 class Foo(object):
 
 @method_decor
 def aa(self):
  # print("This is wraped method")
  raise Exception('aa')
 
 def bb(self):
  print("This is called method")
 
 
 
 a = Foo()
 a.aa()

以上这篇python装饰器相当于函数的调用方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python实现knn算法
Dec 20 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
简单了解python代码优化小技巧
Jul 08 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
python实现PCA降维的示例详解
Feb 24 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
python“静态”变量、实例变量与本地变量的声明示例
Nov 13 Python
Python入门基础之数字字符串与列表
Feb 01 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 Python
Python 实现数组相减示例
Dec 27 #Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 #Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 #Python
pandas的相关系数与协方差实例
Dec 27 #Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 #Python
如何更改 pandas dataframe 中两列的位置
Dec 27 #Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 #Python
You might like
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python中日志logging模块的性能及多进程详解
2017/07/18 Python
python实现日常记账本小程序
2018/03/10 Python
Python读写docx文件的方法
2018/05/08 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
python实现整数的二进制循环移位
2019/03/08 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
浅谈django 重载str 方法
2020/05/19 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
sealed修饰符是干什么的
2012/10/23 面试题
企业行政文员岗位职责
2013/12/03 职场文书
劳动竞赛活动方案
2014/02/20 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
教师读书活动总结
2014/05/07 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
大学毕业生个人总结
2015/02/28 职场文书
感谢师恩主题班会
2015/08/17 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python