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 相关文章推荐
开始着手第一个Django项目
Jul 15 Python
python中使用序列的方法
Aug 03 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
分享vim python缩进等一些配置
Jul 02 Python
python 实现读取一个excel多个sheet表并合并的方法
Feb 12 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
numpy中的meshgrid函数的使用
Jul 31 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python简易开发之制作计算器
Apr 28 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
Sony CFR 320 修复改造
2020/03/14 无线电
福利彩票幸运号码自动生成器
2006/10/09 PHP
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
浅谈Python中range和xrange的区别
2017/12/20 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
中国梦主题教育活动总结
2014/05/05 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
公司离职证明标准格式
2014/11/18 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书