python 装饰器的使用示例


Posted in Python onOctober 10, 2020

无参修饰 ,无参数时不需要调用

def log1(func):
  func()
@log1
def test():
  print('test:')

有参修饰

def log2(func):
  def inner(*args, **kwargs):
    func(*args, **kwargs)
  return inner
@log2
def test(num):
  print('testlog2:',num,test.__name__)
test(20) #相当于log(test(20))

@wraps可以保证装饰器修饰的函数的name的值保持不变

不带参数的装饰器

def log3(func):
  @wraps(func)
  def inner(*args, **kwargs,):
    func(*args, **kwargs)
  return inner
@log3
def test(num):
  print('testlog3:',num,test.__name__)
test(30) #相当于log(test(30))

带参数的装饰器

def log4(level):
  def log(func):
    @wraps(func)
    def inner(*args, **kwargs,):
      if level == "warn":
        print("%s is running" % func.__name__)
      func(*args, **kwargs)
    return inner
  return log
@log4(level="warn")
def test(num):
  print('testlog4:', num, test.__name__)
test(40)

实现带参数和不带参数的装饰器自适应

def log(arg):
  if callable(arg): # 判断参入的参数是否是函数,不带参数的装饰器调用这个分支
    def log3(func):
      @wraps(func)
      def inner(*args, **kwargs, ):
        func(*args, **kwargs)
      return inner
    return log3
  else:
    def log4(func):
      @wraps(func)
      def inner(*args, **kwargs,):
        if arg == "warn":
          print("%s is running" % func.__name__)
        func(*args, **kwargs)
      return inner
    return log4
@log(arg=None)
def test(num):
  print('testlog:', num, test.__name__)
test(0)

返回入参出参

def log5(func):
  def inner(*args, **kwargs):
    print('入参:',func.__name__, args, kwargs)
    res =func(*args, **kwargs)
    print('出参:',func.__name__, res)
    return res
  return inner
@log5
def test(num):
  print('testlog5:', num, test.__name__)
  return num
print(test(50))

类装饰器

class Loging:
  def __init__(self,level):
    self.level = level

  def __call__(self,func):
    @wraps(func)
    def inner(*args, **kwargs):
      if self.level == "warn":
        self.notify(func)
      func(*args, **kwargs)
    return inner

  def notify(self,func):
    print ("%s is running" % func.__name__)


@Loging(level="warn")
def test(num):
  print('testLoging:', num, test.__name__)
test(0)

以上就是python 装饰器的使用示例的详细内容,更多关于python 装饰器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python代码调试的几种方法总结
Apr 15 Python
python中input()与raw_input()的区别分析
Feb 27 Python
使用Python从零开始撸一个区块链
Mar 14 Python
python删除某个字符
Mar 19 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
Python 3 判断2个字典相同
Aug 06 Python
pandas数据处理进阶详解
Oct 11 Python
python 插入日期数据到Oracle实例
Mar 02 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
如何让python的运行速度得到提升
Jul 08 Python
浅析python实现动态规划背包问题
Dec 31 Python
python使用bs4爬取boss直聘静态页面
Oct 10 #Python
通过案例解析python鸭子类型相关原理
Oct 10 #Python
通过实例解析python subprocess模块原理及用法
Oct 10 #Python
如何使用python自带IDLE的几种方法
Oct 10 #Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 #Python
python如何利用Mitmproxy抓包
Oct 10 #Python
python批量生成条形码的示例
Oct 10 #Python
You might like
PHP 中的类
2006/10/09 PHP
我的论坛源代码(二)
2006/10/09 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
webpack配置sass模块的加载的方法
2017/07/30 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python编写登陆接口的方法
2017/07/10 Python
Python的argparse库使用详解
2018/10/09 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
大一新生学期自我评价
2014/04/09 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
户籍证明格式
2014/09/15 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
婚礼家长致辞
2015/07/27 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书