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 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
Python中的函数作用域
May 07 Python
python绘制简单彩虹图
Nov 19 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Django中的AutoField字段使用
May 18 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
python如何实现递归转非递归
Feb 25 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/12/06 PHP
PHP insert语法详解
2008/06/07 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
php中opendir函数用法实例
2014/11/15 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
办公室主任先进事迹
2014/01/18 职场文书
聚美优品的广告词
2014/03/14 职场文书
竞选大队长演讲稿
2014/04/29 职场文书
教师工作失职检讨书
2014/09/18 职场文书
2014年档案室工作总结
2014/12/01 职场文书
大学生自我评价范文
2015/03/03 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL