Python 学习入门(26)—— 装饰器
装饰函数和方法
我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差:
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))
在拥有了基本的数学功能之后,我们可能想为函数增加其它的功能,比如打印输入。我们可以改写函数来实现这一点:
# 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 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))
![](/assets/blank.gif)
装饰器可以用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)。这样,就为装饰器的编写和使用提供了更大的灵活性。
def pre_str(pre=<SPAN style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 1
Python 学习入门(26)—— 装饰器相关推荐
- [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了
参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...
- python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)
装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...
- Python学习笔记:装饰器
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习之路-装饰器生成器正则表达式
装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...
- [转载] python学习笔记——@property装饰器
参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...
- python学习笔记之——装饰器及对象
1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...
- Python学习之路--装饰器
三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- Python学习之路——装饰器
开放封闭原则:不改变调用方式与源代码上增加功能 ''' 1.不能修改被装饰对象(函数)的源代码(封闭) 2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放) ''' View Co ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
最新文章
- Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
- python应该安装哪一个_python安装到哪个盘
- python3精要(5)-最长公共前缀Trie树
- 区分Debug版还是Relase版
- 201571030322/201571030319《小学生四则运算软件需求说明结对项目报告》
- toolStrip 按钮图片大小的修改
- js中export的问题
- FFMpeg,SDL编译 No avaiable video device
- Emacs之multi-occur(替代grep)
- 遗传算法导论(转载)
- 源码安装php5.5
- [高通MSM8909][Android7.1]电信卡信号优化
- 电子技术实训——多功能数字钟的设计
- ip地址解析(scala)
- Linux 下安装与设置Vim编辑器
- java 打印机设置参数设置_Java 打印PDF文档 - 指定打印机、自定义纸张大小、设置打印参数、显示打印对话框等...
- Leetcode 2029. 石子游戏 IX
- java chm文件解析_Java 解析chm文件实战(原创)
- React lazyLoad懒加载
- Unity中,区别LookAt与LookRotation
热门文章
- 被误解最大的基础学科——统计学,到底是个啥?
- 根据手机指南针经纬度在地图上找到其位置
- 关于学习的网站和常用的工具网站的积累——来自贫民窟的孩子(持续更新)
- IObit Uninstaller安装
- [转载] 蒲慕明写给学生的信
- PHP下拉如何选择比选一个,新手养鱼,如何能够选择一个观赏鱼的最佳饲养模式?其实也不难...
- HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)
- 时间戳转换为日期格式(天,小时,分,秒)
- 用pygame编写一个跑酷游戏
- android课程设计致谢,有关课程设计论文的致谢词