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 相关文章推荐
spyder常用快捷键(分享)
Jul 19 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
Python计算公交发车时间的完整代码
Feb 12 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
python实现简单遗传算法
Sep 18 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
python Tkinter模块使用方法详解
Apr 07 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读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
幼儿园园长岗位职责
2013/11/26 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
十八大报告观后感
2014/01/28 职场文书
新品发布会主持词
2014/04/02 职场文书
节约用电标语
2014/06/17 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js