装饰函数和方法

我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差:

# get square sum
def square_sum(a, b):return a**2 + b**2# get square diff
def square_diff(a, b):return a**2 - b**2
print(square_sum(3, 4))
print(square_diff(3, 4))

在拥有了基本的数学功能之后,我们可能想为函数增加其它的功能,比如打印输入。我们可以改写函数来实现这一点:

# modify: print input
# get square sum
def square_sum(a, b):print("intput:", a, b)return a**2 + b**2# get square diff
def square_diff(a, b):print("input", a, b)return a**2 - b**2
print(square_sum(3, 4))
print(square_diff(3, 4))

我们修改了函数的定义,为函数增加了功能。

现在,我们使用装饰器来实现上述修改:

def decorator(F):
    def new_F(a, b):print("input", a, b)return F(a, b)return new_F# get square sum
@decorator
def square_sum(a, b):return a**2 + b**2# get square diff
@decorator
def square_diff(a, b):return a**2 - b**2print(square_sum(3, 4))
print(square_diff(3, 4))

装饰器可以用def的形式定义,如上面代码中的decorator。装饰器接收一个可调用对象作为输入参数,并返回一个新的可调用对象。装饰器新建了一个可调用对象,也就是上面的new_F。new_F中,我们增加了打印的功能,并通过调用F(a, b)来实现原有函数的功能。

定义好装饰器后,我们就可以通过@语法使用了。在函数square_sum和square_diff定义之前调用@decorator,我们实际上将square_sum或square_diff传递给decorator,并将decorator返回的新的可调用对象赋给原来的函数名(square_sum或square_diff)。 所以,当我们调用square_sum(3, 4)的时候,就相当于:

square_sum = decorator(square_sum)
square_sum(3, 4)

我们知道,Python中的变量名和对象是分离的。变量名可以指向任意一个对象。从本质上,装饰器起到的就是这样一个重新指向变量名的作用(name binding),让同一个变量名指向一个新返回的可调用对象,从而达到修改可调用对象的目的。

与加工函数类似,我们可以使用装饰器加工类的方法。

如果我们有其他的类似函数,我们可以继续调用decorator来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。

含参的装饰器

在上面的装饰器调用中,比如@decorator,该装饰器默认它后面的函数是唯一的参数。装饰器的语法允许我们调用decorator时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。

# a new wrapper layer
def pre_str(pre=<SPAN style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 1

Python 学习入门(26)—— 装饰器相关推荐

  1. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  2. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  3. Python学习笔记:装饰器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...

  5. [转载] python学习笔记——@property装饰器

    参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...

  6. python学习笔记之——装饰器及对象

    1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...

  7. Python学习之路--装饰器

    三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...

  8. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  9. Python学习之路——装饰器

    开放封闭原则:不改变调用方式与源代码上增加功能 ''' 1.不能修改被装饰对象(函数)的源代码(封闭) 2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放) ''' View Co ...

  10. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

最新文章

  1. Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
  2. python应该安装哪一个_python安装到哪个盘
  3. python3精要(5)-最长公共前缀Trie树
  4. 区分Debug版还是Relase版
  5. 201571030322/201571030319《小学生四则运算软件需求说明结对项目报告》
  6. toolStrip 按钮图片大小的修改
  7. js中export的问题
  8. FFMpeg,SDL编译 No avaiable video device
  9. Emacs之multi-occur(替代grep)
  10. 遗传算法导论(转载)
  11. 源码安装php5.5
  12. [高通MSM8909][Android7.1]电信卡信号优化
  13. 电子技术实训——多功能数字钟的设计
  14. ip地址解析(scala)
  15. Linux 下安装与设置Vim编辑器
  16. java 打印机设置参数设置_Java 打印PDF文档 - 指定打印机、自定义纸张大小、设置打印参数、显示打印对话框等...
  17. Leetcode 2029. 石子游戏 IX
  18. java chm文件解析_Java 解析chm文件实战(原创)
  19. React lazyLoad懒加载
  20. Unity中,区别LookAt与LookRotation

热门文章

  1. 被误解最大的基础学科——统计学,到底是个啥?
  2. 根据手机指南针经纬度在地图上找到其位置
  3. 关于学习的网站和常用的工具网站的积累——来自贫民窟的孩子(持续更新)
  4. IObit Uninstaller安装
  5. [转载] 蒲慕明写给学生的信
  6. PHP下拉如何选择比选一个,新手养鱼,如何能够选择一个观赏鱼的最佳饲养模式?其实也不难...
  7. HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)
  8. 时间戳转换为日期格式(天,小时,分,秒)
  9. 用pygame编写一个跑酷游戏
  10. android课程设计致谢,有关课程设计论文的致谢词