详解Python中最难理解的点-装饰器
作者:菜鸟学Python 发布时间:2023-02-14 04:51:59
本文将带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了.
一、什么是装饰器
网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象
每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?
我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤
在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了
装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效
二、装饰器的前传4步曲
为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:
1)函数也是对象
def message(word='hello'):
return word.upper()+'!'
print message()
>>
HELLO!
my_message=message
print my_message
>>
<function message at 0x000000000288E198>
print my_message()
>>
HELLO!
也就是说message可以赋值给另外一个变量
2)函数可以嵌套,定义在另外一个函数内部
def show():
print 'Run in show()'
def message(word='hello'):
return word
print message()
show()
>>
Run in show()
hello
message可以嵌套在show函数里面,调用show的时候也会跑下message函数
3)函数作为参数返回
一个函数还可以当做另外一个函数的返回值,不信看下面这个例子
>>
<function lower at 0x00000000027DAD68>
hello...
4)函数作为参数传入
我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数
>>
I will call the getName function later
leo
三、装饰器的真面目
1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套
装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码
a_stand_alone_function()
>>
I am a stand alone function,don't you dare modify me
a_stand_alone_function_decorated=my_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
>>
Before the function runs
I am a stand alone function,don't you dare modify me
After the function runs
2).使用装饰器
看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效
其实相当于:
another_stand_alone_function=my_new_decorator(another_stand_alone_function)
四、为什么要使用装饰器
装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易。
如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子:
我们有一个主题函数word()
是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:
>>
<b><i>hello</i></b>
有一点要注意,就是装饰器的顺序变了,结果是不一样的.
@makeitalic
@makebold
def word():
return "hello"
print word()
>>
<i><b>hello</b></i>
好了装饰器的入门,就讲到这里,若有什么不懂的,也可以留言跟我探讨交流。其实还有很多装饰器的高级用法,比如装饰器传参数,类的装饰器等等我们后面会讲解。
来源:https://ask.hellobi.com/blog/caoniao_xueyuan/7111


猜你喜欢
- 插件是干什么用的详细地址1.下载rainbow-fart目前在vscode中还不能搜索到此插件,只能从官网中下载,官方地址:地址2.安装ra
- 一、分组原理核心:1、不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。2、
- 一、mysql自连接mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。我们举例说明,下面是商品采购表,我们需
- 过滤器模板层对变量的操作实际还有很多,过滤器就是其中一种。学过Linux系统的一定知道管道操作符,其可以将上一步输出直接作为下一步输入进行处
- 本文实例为大家分享了微信小程序定时拍照的具体代码,供大家参考,具体内容如下在某些进行签到的场景,为了防止用户选择相册的照片或者不实时拍照,设
- 10线程同时操作,频繁出现插入同样数据的问题。虽然在插入数据的时候使用了: insert inti tablename(fields....
- 传统方式需要10s,dat方式需要0.6simport osimport timeimport torchimport randomfrom
- 第七步: 在自定义分页的Repeater 里添加排序功能现在已经完成了自定义分页,我们再来添加排序功能。ProductsBLL类的GetPr
- 最近出的每日一题里面,有一道是关于合并同类型数据为一行的题,使用SQL Server 2017版本及以上的直接使用STRING_AGG()函
- Rect(rectangle)指的是矩形,或者长方形,在 Pygame 中我们使用 Rect() 方法来创建一个指定位置,大小的矩形区域。函
- 本文实例讲述了python使用pil生成图片验证码的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: utf-8 -
- 我们在平常的系统开发中常常会遇到像无限级分类这样的树型结构数据,现提供一个可用的数据库存储过程,可以完成树型结构数据的排序。环境:windo
- 一、新建项目,在主配置文件中,修改以下内容:ALLOWED_HOSTS = ['127.0.0.1','localh
- 你可以将FCKEDITOR放置到任何文件夹,默认情况下,将其放入到FCKEDITOR文件夹是最为简单的方法.如果你放入的文件夹使用别的名称,
- Exec 是 os 包中的一个子包,它可用于使用 Go 运行外部命令。Go exec 命令教程展示了如何在 Golang 中执行 shell
- MySQL的SQRT函数是用来计算出任何数量的平方根。可以使用SELECT语句找出方检定根的任意数如下:mysql> select S
- 记录遇到的问题;在aliyun上安装MySQL时由于上次错误卸载mysql 导致校验文件出问题;处理方式有几种1到mysql官网下载校验文件
- 不管是上学还是上班都会统计考勤,有些学校或公司会对每月缺卡次数过多(比如三次以上)的人员进行处罚。有些公司还规定对于基层员工要在工作日提交日
- 一、卷积神经网络Yann LeCun 和Yoshua Bengio在1995年引入了卷积神经网络,也称为卷积网络或CNN。CNN是一种特殊的
- 运行时请在其目录下添加user.txt passwd.txt两文件。否则会报错。程序没有加异常处理。代码比较挫.....#coding:ut