上篇文章 Python装饰器为什么难理解?从函数到装饰器一步一步介绍了Python装饰器的来由,不知你对装饰器理解了没有,强烈建议你自己动手写个装饰器应用到项目中加深理解。装饰器可以很简单,也可以很复杂,具体看业务场景,简单装饰器不带任何参数,而带参数的装饰器则更灵活,还有一种更为复杂的叫类装饰器。

哪些地方适合用装饰器呢?但凡是在多个地方出现雷同的代码块,且这些代码与核心业务没有直接关联的都可以用装饰器来代替,装饰器不仅能减少代码量,还使得代码逻辑更清晰、可读性更强,你只需专注于业务逻辑处理就行了。

今天说说带参数的装饰器,为了简化业务逻辑,我们实现字符串大写转换的需求,重点关注装饰器部分:

# 业务函数

def my_upper(text):

value = text.upper()

return value

print(my_upper("hello")) # HELLO

现在需求有变更,核心业务不变,但是需要对转换的的字符包裹一层HTM标签,输出如:

HELLO

,最简单的办法就是直接在函数里面修改逻辑,如:

def my_upper(text):

value = text.upper()

return "

" + value + "

"

又接到产品通知,需求有变更,还要在外面套一个div,于是你很不情愿地回去再修改:

def my_upper(text):

value = text.upper()

return "

" + value + "

"

如何应对产品这种无止境的修改呢?

玩笑开完了,技术还是要为业务服务啊,那我们就想一个可以灵活应对产品的办法吧,这里,装饰器就是一个很好的方案。最终效果应该是这样:

@tag("p")

def my_upper(text):

value = text.upper()

return value

print(my_upper("hello")) #

HELLO

如何实现呢?先从简单装饰器开始,实现一个不带参数的装饰器

def tag(func):

def wrapper(text):

value = func(text)

return "

" + value + "

"

return wrapper

@tag

def my_upper(text):

value = text.upper()

return value

调用

print(my_upper("hello")) #

hello

@tag 语法糖等价于 my_upper = tag(my_upper)

my_upper("hello") 等价于 wrapper("hello") 尽管你不能直接访问wrapper,但可以这样去理解

使用装饰器,业务代码一行的都没改,只需要在函数定义处加上装饰器,就实现了相同的功能,那么如何更灵活地通过参数来指定输出的样式呢?使用带参数的装饰器

带参数的装饰器

带参数的装饰器只需要在原来那个不带参数的装饰器基础上之上在最外层套一个函数,该函数中定义一个参数,然后嵌套函数中引用该参数即可实现。从下图看出,我只是把里面那个函数改了一下名字,其余和原来不带参数的装饰器是一样的。有没有觉得这样更灵活?

当然,装饰器不仅可以修饰函数,还可以修饰类。

娱乐时间

最后留给大家一个问题,给函数实现一个日志记录功能,日志里面记录函数名,函数执行所花的时间,通过指定参数控制日志级别,第一个写出来且正确的读者可以找我领取10元红包。考虑到代码在留言区显示不好好,你可以使用 https://gist.github.com/ 然后直接回复代码链接就可以。(此活动仅在公众号有效)

有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

python 装饰器 参数-[Python]写个带参数的装饰器相关推荐

  1. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  2. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  3. 宏定义有无参数宏定义和带参数宏定义两种

    宏定义有无参数宏定义和带参数宏定义两种. 无参数的宏定义的一般形式为 # define 标识符 字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔. ...

  4. php文件添加音乐播放器,window_win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程,   播放器在哪?1 - phpStudy...

    win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程 播放器在哪? 1.点击桌面的左下端"开始菜单"符号,然后在右上角,找到" ...

  5. python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  6. url没有参数名怎么直接带参数_用30行Python爬虫带你看PLMM(划掉,喵星人)

    偶尔写写爬虫也算是打磨无聊生活的一种方式了. 之前写了一个用100多行Python爬虫看世界的帖子,有兴趣的朋友可以看一下. 带你用100多行Python爬虫看看今天的世界(上) 带你用100多行Py ...

  7. python用海伦公式求面积_用带参数的宏定义,通过海伦公式求三角形的面积

    要求: 海伦公式: ,其中 ,a,b,c为三角形的三个边.定义两个带参数的宏,一个用来求p,另一个用来求s 题目分析: 首先,题目要求是通过输入三角形的三条边,输出三角形的面积.因为不是任意的三条边都 ...

  8. python播放wav文件_python3 写一个WAV音频文件播放器的代码

    环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:ki ...

  9. response响应对象参数和方法是啥?怎么发送带请求头的请求(headers参数)怎么发送带参数的请求?cookieJar的转换方法是什么?

    在python里所有变量都是对象 import requestsurl = 'http://www.baidu.com/'respone = requests.get(url)# 参数 # 响应的ur ...

最新文章

  1. 《IT项目管理》读书笔记(9) —— 项目沟通管理
  2. 数据库-MySQL-SQL语句
  3. 手写数字识别全部代码--全连接神经网络方法
  4. 私有化 Serverless Application 的探索与思考
  5. [Python]集合的交集,并集,差集
  6. Silverlight4 麦克风应用-录音机
  7. 北大计算机与微电子学校,中国计算机大会CNCC2019在苏州隆重举行
  8. HTML基础-综合案例1-学生信息表
  9. 关于 SONY WF1000XM3 在 Windows 10 下蓝牙连接只有 Handfree 没有 Stereo 模式
  10. 如何顺利获得美国工作签证
  11. 未加载coreavcdecoder.ax所用的符号
  12. MATLAB DCT变换原理和源码
  13. Ajax洗洁精的特性,洗涤剂中常用表面活性剂的特点
  14. HT合泰单片机入门教程(第五章 PWM)
  15. 移动硬盘插入无显示,不用格式化-修复方法
  16. 轻松搭建--类似微信的聊天工具
  17. “统信杯” 第十七届黑龙江省大学生程序设计竞赛 Let‘s Swap
  18. 【单片机】矩阵键盘函数
  19. Linux部署磁盘阵列、损坏磁盘阵列及修复、磁盘阵列+备份盘、LVM
  20. 腾盛博药上市首日破发:获资本热捧,博裕资本为第一大股东

热门文章

  1. LMDB中的mmap、Copy On Write、MVCC深入理解——讲得非常好,常来看看!
  2. 倒排列表求交集算法汇总
  3. numpy vsplit
  4. scrapy windows
  5. 使用Redis实现最近N条数据的决策
  6. 常见Java集合的实现细节
  7. pytest_01-环境准备与入门
  8. APM-应用性能管理
  9. BZOJ4008. [HNOI2015]亚瑟王 期望概率dp
  10. 使用iOS原生sqlite3框架对sqlite数据库进行操作