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使用MD5加密字符串示例
Aug 22 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
python查看微信好友是否删除自己
Dec 19 Python
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
python读取和保存图片5种方法对比
Sep 12 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
python输出决策树图形的例子
Aug 09 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
Pytorch 中的optimizer使用说明
Mar 03 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
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
JS对日期操作封装代码实例
2019/11/08 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
基于python历史天气采集的分析
2019/02/14 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
python exit出错原因整理
2020/08/31 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
三八红旗手先进事迹材料
2014/05/13 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
python中pymysql包操作数据库方法
2022/04/19 Python
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技