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实现发送email的几种常用方法
Aug 18 Python
python计算牛顿迭代多项式实例分析
May 07 Python
Python中有趣在__call__函数
Jun 21 Python
Python 将RGB图像转换为Pytho灰度图像的实例
Nov 14 Python
浅析python的优势和不足之处
Nov 20 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
Django获取应用下的所有models的例子
Aug 30 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
python画环形图的方法
Mar 25 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 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格式化金额函数分享
2015/02/02 PHP
php curl常用的5个经典例子
2017/01/20 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
浅析Python中的join()方法的使用
2015/05/19 Python
构建Python包的五个简单准则简介
2015/06/15 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
中学音乐课教学反思
2016/02/18 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android