传说中Python最难理解的点|看这完篇就够了(装饰器)

传说中Python最难理解的点|看这完篇就够了(装饰器)

https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ

1.什么是装饰器

 

网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象

  • 每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?

  • 我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤

  • 在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了

     

装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效

 

 

2.装饰器的前传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

 

3.装饰器的真面目

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)

 

4.为什么要使用装饰器

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

 

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

 

 

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

 

传说中Python最难理解的点|看这完篇就够了(装饰器)

>>

<b><i>hello</i></b>

 

有一点要注意,就是装饰器的顺序变了,结果是不一样的.

@makeitalic

@makebold

def word():

return “hello”

print word()

>>

<i><b>hello</b></i>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113050.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Debug的使用方法

    Debug的使用方法Debug(学完Debug之后要求能够使用Debug查看程序的执行流程)1.1Debug概述Debug:是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可也用于追踪程序执行过程来调试程序。1.2Debug操作流程Debug调试,又被称为断点调试,断点其实是一个标记,告诉我们从哪里开始查看。Debug操作流程:如何加断电 如何运行加了断点的程序 看哪里 点哪里 如何删除断点1.2.1如何加断点设置要设置断点的代码行,在行号的区域后面单击鼠标左键即可。

  • 最长上升子序列(LIS)算法

    最长上升子序列(LIS)算法LIS定义LIS(LongestIncreasingSubsequence)最长上升子序列 一个数的序列bi,当b1&lt;b2&lt;…&lt;bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiK),这里1&lt;=i1&lt;i2&lt;…&lt;iK…

  • 程序书写规范笔记

    程序书写规范笔记

  • Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式

    Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式代码中实现了电码本ECB模式和密文分组连接CBC模式,SM3.java和SM4.java为算法实现类,utils的都是根据实现类写的工具,可以根据需要调用杂凑算法SM3的杂凑功能获得杂凑值。SM4.java中sm4_crypt_ecb(SM4_Contextctx,byte[]input)ECB模式加解密方法,根据密钥判断加解密功能sm4_crypt_cbc(…

  • linux dpkg命令

    linux dpkg命令**apt-get(来自:http://wiki.ubuntu.org.cn/Apt-get%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97)apt-getupdate——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。apt

  • gallery的画廊效果

    gallery的画廊效果

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号