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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
详解Python map函数及Python map()函数的用法
Nov 16 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
如何使用PyCharm及常用配置详解
Jun 03 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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简单实现加减乘除计算器
2014/01/06 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python求最大值最小值方法总结
2019/06/25 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
私有程序集与共享程序集有什么区别
2013/04/05 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
人事部主管岗位职责
2013/12/26 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
保研导师推荐信
2015/03/25 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
太行山上观后感
2015/06/05 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL