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使用socket连接远程服务器的方法
Apr 29 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
python用户管理系统
Mar 13 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python3 修改默认环境的方法
Feb 16 Python
解决yum对python依赖版本问题
Jul 05 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
Python图片的横坐标汉字实例
Dec 04 Python
Python 实现OpenCV格式和PIL.Image格式互转
Jan 09 Python
Python中如何引入第三方模块
May 27 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
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
JS库之ParticlesJS使用简介
2017/09/12 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
Django权限机制实现代码详解
2018/02/05 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
英国健身专家:WIT Fitness
2021/02/09 全球购物
前台文员职责范本
2014/03/07 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年营销工作总结
2014/11/22 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
安全员岗位职责范本
2015/04/11 职场文书
前台岗位职责范本
2015/04/16 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS
服务器nginx权限被拒绝解决案例
2022/09/23 Servers