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进阶教程之模块(module)介绍
Aug 30 Python
Python获取网页上图片下载地址的方法
Mar 11 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
Python基于select实现的socket服务器
Apr 13 Python
Python开发的HTTP库requests详解
Aug 29 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
Python双链表原理与实现方法详解
Feb 22 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 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中检查文件或目录是否存在的代码小结
2012/10/22 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
Python判断直线和矩形是否相交的方法
2015/07/14 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
python ftplib模块使用代码实例
2019/12/31 Python
python实现画图工具
2020/08/27 Python
详解Scrapy Redis入门实战
2020/11/18 Python
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
内勤岗位职责范本
2015/04/13 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
开学第一周值周总结
2015/07/16 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL