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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
Python功能键的读取方法
May 28 Python
python实现简单socket通信的方法
Apr 19 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
python3正则提取字符串里的中文实例
Jan 31 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
python OpenCV学习笔记
Mar 31 Python
python基于opencv批量生成验证码的示例
Apr 28 Python
Python中第三方库Faker的使用详解
Apr 02 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类
2008/04/09 PHP
php csv操作类代码
2009/12/14 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
php异常处理捕获错误整理
2019/09/23 PHP
jQuery示例收集
2010/11/05 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
JS高级运动实例分析
2016/12/20 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Django的信号机制详解
2017/05/05 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
法律进社区实施方案
2014/03/21 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
2016春节家属慰问信
2015/03/25 职场文书