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去除列表中重复元素的方法
Mar 20 Python
python threading模块操作多线程介绍
Apr 08 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
Python输出\u编码将其转换成中文的实例
Dec 15 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
Python常用库大全及简要说明
Jan 17 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
node.js的事件机制
2017/02/08 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
大学迎新生标语
2014/10/06 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
python 解决微分方程的操作(数值解法)
2021/05/26 Python
python四种出行路线规划的实现
2021/06/23 Python