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深入学习之闭包
Aug 31 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
开源Web应用框架Django图文教程
Mar 09 Python
python 生成图形验证码的方法示例
Nov 11 Python
python多个模块py文件的数据共享实例
Jan 11 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
python实现维吉尼亚加密法
Mar 20 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
python离线安装外部依赖包的实现
Feb 13 Python
python实现Thrift服务端的方法
Apr 20 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生成短网址示例
2014/05/05 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
JScript的条件编译
2007/05/29 Javascript
用javascript做拖动布局的思路
2008/05/31 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
python生成器generator用法实例分析
2015/06/04 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
春节联欢会主持词
2014/03/24 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
货款欠条范本
2015/07/03 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android