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 27 Python
用yum安装MySQLdb模块的步骤方法
Dec 15 Python
Python中datetime模块参考手册
Jan 13 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
Python读取stdin方法实例
May 24 Python
python批量解压zip文件的方法
Aug 20 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
python函数超时自动退出的实操方法
Dec 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
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
php自动加载机制的深入分析
2013/06/08 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
php cli配置文件问题分析
2015/10/15 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python截取两个单词之间的内容方法
2018/12/25 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
如何获得EntityManager
2014/02/09 面试题
大学生个人事迹材料
2014/01/21 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
给孩子的新年寄语
2014/04/08 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
《社戏》教学反思
2016/02/22 职场文书