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黑魔法@property装饰器的使用技巧解析
Jun 16 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
分享vim python缩进等一些配置
Jul 02 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
基于python生成英文版词云图代码实例
May 16 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
python3 kubernetes api的使用示例
Jan 12 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
Selenium浏览器自动化如何上传文件
Apr 06 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.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
如何打开php的gd2库
2017/02/09 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
jQuery ajaxForm()的应用
2016/10/14 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
分析在Python中何种情况下需要使用断言
2015/04/01 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
毕业自我鉴定
2013/11/05 职场文书
欢送退休感言
2014/02/08 职场文书
机房搬迁方案
2014/05/01 职场文书
经费申请报告范文
2015/05/18 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
护理工作心得体会
2016/01/22 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Python OpenCV实现图形检测示例详解
2022/04/08 Python