作用

简单的说,python修饰器就是可以对函数参数以及返回结果进行操作。

如果已经懂了函数闭包的朋友相信已经大概知道该怎么做了,还有不懂的朋友可以看我的这篇文章——python闭包简记。

理解修饰器

我用一个求取平均分的简单案例来说明修饰器的具体用法。

# 装饰器
def check(func):  # 这里传入要处理的函数名def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,kwargs={'python': 48, 'c': 89, 'java': 86}"""这里可以对传入的参数进行操作"""avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数"""这里对生成的结果进行操作"""return avg            # 最后将结果返回  return realCheck          # 闭包函数经典特征,以内函数作为返回结果def avgScore(python,c,java):   # 定义一个求平均值的方法return (python+c+java) / 3score = check(avgScore)  # 手动修饰器 print(score(python=48,c=89,java=86))  # 输出结果,注意在这里传入参数#  print(check(avgScore)(python=48,c=89,java=86))  # 当然也能够一气呵成,两步化作一步。

上面代码已经将使用修饰器功能的雏形给打造出来了。也许有同学会问:平常我见到的修饰器不是用 @修饰器名 写在被修饰函数前面的吗?没错确实是,上面写法是另一种形式,我想那种写法应该是修饰器最原本的写法吧!

平时见到的应该是这种写法。

# 装饰器
def check(func):  # 这里传入要处理的函数名def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c': print(kwargs)"""这里可以对传入的参数进行操作"""avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数"""这里对生成的结果进行操作"""return avg            # 最后将结果返回  return realCheck          # 闭包函数经典特征,以内函数作为返回结果@check  # 注意没有空格
def avgScore(python,c,java):   # 定义一个求平均值的方法return (python+c+java) / 3print(avgScore(python=48,c=89,java=86))  # 输出结果

ok,我们现在分析一下这部分代码,在check函数中,它需要传入一个函数作为他的参数,然后以内函数(realCheck)作为返回值,执行内函数。说白了check函数的功能仅仅是用来接收avgScore函数,营造环境供realCheck使用而已。当然,check函数里面除了定义realCheck函数也可以定义其他的变量方法等,因为这个案例比较简单,定义realCheck函数即可。在 realCheck 函数中需要接收传递过来的参数,参数与avgScore函数中的参数相对应,因为本来就是修饰它的。接着就是进行相应的逻辑处理了。

最后的难点就在于如何写明修饰器。如果理解了就觉得简单,没理解就觉得很绕。看看能不能理解这句话:就是向 修饰器函数 传入需要 被 修饰的函数,然后还需要一个括号将参数传递进去。 就能实现修饰器函数的功能了。

修饰器的使用

理解完修饰器的大概流程后我们就看看如何去使用它。回想一下修饰器要用来干啥?修饰器的出现就是为了能够更加完善函数,提升代码质量。

看一下上面的代码,有什么问题?没错,python分数太低了,我们学python这么认真怎么可能这么低分?? 修改一波!

# 装饰器
def check(func):  # 这里传入要处理的函数名def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c':if kwargs["python"] < 95:  kwargs["python"] = 100avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数"""这里对生成的结果进行操作"""return avg            # 最后将结果返回  return realCheck          # 闭包函数经典特征,以内函数作为返回结果

我们对传入的参数进行一个判断,如果python分数低于95分,那么就让他等于100分。其实这个过程就印证了开头说的,修饰器能够对参数进行处理。

接着再来看看有什么问题?如果能够复制代码执行一遍就知道有什么问题了。没错!

我们没有处理小数。算个分数怎么可能有这么多小数的?所以我们还需要进行处理。

# 装饰器
def check(func):  # 这里传入要处理的函数名def realCheck(**kwargs):  # 这里会获取传入的所有关键字参数,,kwargs={'python': 48, 'c':if kwargs["python"] < 95:kwargs["python"] = 100avg = func(**kwargs)  # 调用函数方法,相当于执行了avgScoe函数s = int(avg)+0.5avg = s if avg > s else int(avg)return avg            # 最后将结果返回  return realCheck          # 闭包函数经典特征,以内函数作为返回结果@check  # 注意没有空格
def avgScore(python,c,java):   # 定义一个求平均值的方法return (python+c+java) / 3print(avgScore(python=48,c=89,java=86))  # 输出结果

我们对结果进行处理,如果这个分数的小数部分大于等于0.5那就让他小数部分为0.5,否则不要小数。举个例子,如果是91.666 那么结果就是91.5 如果是91.333 那么结果就是91。这一步就印证了开头所说的能够对返回结果进行处理。

至此,修饰器的基本使用我已经讲解完了,如果有对某一步有疑惑的同学可以在下方留言,我会一一回复。

python 修饰器相关推荐

  1. Python修饰器的函数式编程

    转载自:https://coolshell.cn/articles/11265.html 加了一些自己的注释. Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其 ...

  2. python修饰器原理_Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...

  3. 作为程序员,起码要知道的 Python 修饰器!

    Python修饰器是个非常强大的概念,可以用一个函数去"包装"另一个函数.修饰器的思想,就是把函数中除了正常行为之外的部分抽象出去.这样有很多好处,如很容易进行代码复用,并且能遵守 ...

  4. python 修饰器 教程_python 实现 修饰器模式

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继 ...

  5. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  6. python装饰器-python修饰器(装饰器)以及wraps

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...

  7. 介绍python修饰器的书_python修饰器

    1.参数args与kwargs: *args是元组,如def fun(args): pass 传过去的参数是元组形式fun(1,2,3),args=(1,2,3); *kwargs是字典型,如def ...

  8. 针对递归函数的优化与Python修饰器实现

    我们围绕一个数学问题来说明本文的思想,组合数C(n,i),也就是从n个元素中任选i个,共有多少种选法.当然,这个问题有很多种求解方法,例如最快的组合数算法之Python实现.本文主要分析组合数的递归求 ...

  9. python修饰器classmate_python3大器----装饰器,迭代器,生成器

    目录 一:闭包: 1:闭包的作用和定义: 2:闭包的形成条件: 3:闭包的经典案例: 4:闭包的原理: 5: 闭包中使用外部函数变量: 二:装饰器: 1:装饰器的定义和作用: 2:装饰器经典案例分析: ...

最新文章

  1. Json文件解析(上)
  2. 计算机视觉的优点和局限性
  3. 程序设计原则——优化程序
  4. wamp 使用mysql_PHP当中如何使用Wampserver连接到Mysql数据库以及怎样使用
  5. Linux应用集成MySQL数据库访问技巧
  6. MonkeyFest2018 微软最有价值专家讲座
  7. oracle之数据处理之其他数据库对象练习
  8. 第三天,编码设置,主键设置与删除,无关子查询,相关子查询,表与表之间的关系...
  9. C语言之字符串探究(七):atoi、itoa——整型数字和字符串的相互转换
  10. prerenderspaplugin 打包完成后如何让百度收录_网站优化技术第一篇(如何快速提升网站的收录量?)...
  11. Hive的行转列及列转行函数使用总结
  12. VARCHART XGantt甘特图具有更多功能的HTML5 / Gantt图表的可视计划小部件
  13. python读取csmar_Python:爬取上市公司公告-Wind-CSMAR
  14. 史上最全的vue.js源码解析(一)
  15. win7锁定计算机自动关机,win7电脑怎么定时关机_win7系统设置自动关机的方法
  16. 英伟达RTX 2060发布:《战地5》光追超60帧,349美元(转载自IT之家)
  17. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  18. 用word模板制作幻灯片
  19. Atitit保证架构超前性 前瞻性 目录 第一章 简单抽象原则 道和术的区别 1 第一节 原则 kiss 1 第二节 提升到层次哲学层次 1 第三节 命名也要通用抽象 隐藏细节 1 第二章 通用性原
  20. 实例7:七段数码管绘制

热门文章

  1. 当你讨厌一个人的时候,那个人也会讨厌你
  2. 分析称,《华尔街日报》夸大ShapeShift洗钱数额逾600万美元(上篇)
  3. 幅度响应怎么计算_5G能颠覆4G时代吗?来看看专家怎么说
  4. element-plus 表格单元格的合并
  5. STM32重写fputc汇总
  6. cxLookupCombobox实现两列模糊查询
  7. js导出excel单元格内换行符代码_如何使用php以excel格式导出带换行符的值?
  8. xjoi 1542 枚举集合 2
  9. 轻而易举拥有xp风格的界面
  10. 易百教程mysql_MySQL UNION