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 dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
python获取栅格点和面值的实现
Mar 10 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
理解深度学习之深度学习简介
Apr 14 Python
Python 中面向接口编程
May 20 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php木马攻击防御之道
2008/03/24 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
JavaScript表单常用验证集合
2008/01/16 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python中的闭包详细介绍和实例
2014/11/21 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
办加油卡单位介绍信
2014/01/09 职场文书
大学新生欢迎词
2014/01/10 职场文书
村级换届选举方案
2014/05/10 职场文书
新教师个人总结
2015/02/06 职场文书
农村党支部承诺书
2015/04/30 职场文书
周一给客户的问候语
2015/11/10 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android