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简单实现旋转图片的方法
May 30 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
python感知机实现代码
Jan 18 Python
Python 求数组局部最大值的实例
Nov 26 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
python中pickle模块浅析
Dec 29 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
SVG实现时钟效果
2018/07/17 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Django model 中设置联合约束和联合索引的方法
2019/08/06 Python
python字符串的拼接方法总结
2019/11/18 Python
postman和python mock测试过程图解
2020/02/22 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
世界上最好的帽子:Tilley
2016/11/27 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
《匆匆》教学反思
2014/02/22 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
升学宴祝酒词
2015/08/11 职场文书