详解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)函数作为参数返回

一个函数还可以当做另外一个函数的返回值,不信看下面这个例子

详解Python中最难理解的点-装饰器


>>
<function lower at 0x00000000027DAD68>
hello...

4)函数作为参数传入

我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数

详解Python中最难理解的点-装饰器


>>
I will call the getName function later
leo

三、装饰器的真面目

1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套
装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码

详解Python中最难理解的点-装饰器


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).使用装饰器

详解Python中最难理解的点-装饰器

看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效

其实相当于:


another_stand_alone_function=my_new_decorator(another_stand_alone_function)

四、为什么要使用装饰器

装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易。

如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子:

我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:

详解Python中最难理解的点-装饰器


>>
<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

标签:python,装饰器
0
投稿

猜你喜欢

  • Python3+cgroupspy安装使用简介

    2022-11-13 15:11:21
  • pandas 数据结构之Series的使用方法

    2022-08-13 15:56:39
  • python 实现体质指数BMI计算

    2023-01-25 12:44:56
  • 教你怎么用Python监控愉客行车程

    2021-10-22 17:59:37
  • 简单介绍Python虚拟环境及使用方法

    2021-03-19 20:59:53
  • MySQL多表查询的案例详解

    2024-01-24 13:11:26
  • 汉明码编码原理及校验方法分析

    2022-10-09 06:38:13
  • go类型转换及与C的类型转换方式

    2024-04-28 09:18:38
  • 调整Jupyter notebook的启动目录操作

    2022-04-02 19:40:58
  • pytorch Dataset,DataLoader产生自定义的训练数据案例

    2022-12-05 06:41:23
  • Python实现合成多张图片到PDF格式

    2023-02-26 04:57:25
  • FCKeditor 2.6.6在ASP中的安装及配置方法分享

    2022-09-16 12:45:32
  • SQL Server的基本功能性语句介绍

    2024-01-19 20:33:02
  • Python操作lxml库实战之Xpath篇

    2023-12-26 23:08:00
  • Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)

    2022-03-23 08:31:22
  • javascript页面上使用动态时间具体实现

    2024-05-11 09:36:06
  • SQL查询语句执行的过程

    2024-01-22 21:51:02
  • JavaScript Base64编码和解码,实现URL参数传递。

    2024-04-22 22:45:32
  • python通过安装itchat包实现微信自动回复收到的春节祝福

    2022-07-09 20:36:26
  • Python中字符串格式化str.format的详细介绍

    2021-08-19 01:28:37
  • asp之家 网络编程 m.aspxhome.com