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 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
python删除列表中重复记录的方法
Apr 28 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
详解Python核心对象类型字符串
Feb 11 Python
Python实现的文轩网爬虫完整示例
May 16 Python
numpy中的ndarray方法和属性详解
May 27 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
Python实现Singleton模式的方式详解
Aug 08 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
Flask缓存静态文件的具体方法
Aug 02 Python
Django路由层URLconf作用及原理解析
Sep 24 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/10/30 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
python实现自动更换ip的方法
2015/05/05 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
学生喝酒检讨书
2014/02/06 职场文书
建议书标准格式
2014/03/12 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
工程质量承诺书
2014/03/27 职场文书
2014年清明节寄语
2014/04/03 职场文书
交通事故协议书范本
2014/11/18 职场文书
教师节主题班会教案
2015/08/17 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python