传说中Python最难理解的点|看这完篇就够了

摘要:
我相信您了解Python函数,但您知道函数也是可以作为参数传递的对象吗?让我们看看下面的示例:1)函数也是对象defmessage:returnword。上限()+'!作为一种结构化工具,装饰器自然会促进代码的封装,从而减少冗余,并使未来的维护和扩展更加容易。

传说中Python最难理解的点|看这完篇就够了第1张传说中Python最难理解的点|看这完篇就够了第2张

今天我就带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了.

1.什么是装饰器

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

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

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

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

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

传说中Python最难理解的点|看这完篇就够了第3张

2.装饰器的前传4步曲

为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:

1)函数也是对象

def message(word='hello'):

return word.upper()+'!'

print message()

>>

HELLO!

my_message=message

print my_message

>>

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最难理解的点|看这完篇就够了第4张传说中Python最难理解的点|看这完篇就够了第2张

>>

hello...

4)函数作为参数传入

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

传说中Python最难理解的点|看这完篇就够了第6张传说中Python最难理解的点|看这完篇就够了第2张

>>

I will call the getName function later

leo

3.装饰器的真面目

1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套

装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码

传说中Python最难理解的点|看这完篇就够了第8张传说中Python最难理解的点|看这完篇就够了第2张

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最难理解的点|看这完篇就够了第10张传说中Python最难理解的点|看这完篇就够了第2张

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

其实相当于:

another_stand_alone_function=my_new_decorator(another_stand_alone_function)

4.为什么要使用装饰器

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

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

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

传说中Python最难理解的点|看这完篇就够了第12张传说中Python最难理解的点|看这完篇就够了第2张

输出<b><i>hello<i><b>

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

@makeitalic

@makebold

def word():

return "hello"

print word()

输出<i><b>hello<b><i>

免责声明:文章转载自《传说中Python最难理解的点|看这完篇就够了》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringMVC(十五):Dispatcher的重要组件之一MultipartResolver(StandardServletMultipartResolver和CommonsMultipartResolver)的用法安装Ubuntu 20.04 LTS服务器系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

五. python数据转换

1. 数据转换    set  tuple   list  dict  int   float # list ----set a1=[1,2,3,4,5,6] a2=set(a1) print(a2) #{1, 2, 3, 4, 5, 6} # tuple----set a3=(1,2,3000,4,5,600000) a4=set(a3) pr...

Linux系统BTC挖矿傻瓜教程

【Linux系统BTC/比特币矿池挖矿方案一】cgminer矿池挖矿程序(Linux系统 比特币(BTC) 矿池挖矿/采矿/造币)cgminer矿池挖矿程序【查看这里有没有最新版】http://ck.kolivas.org/apps/cgminer/https://github.com/ckolivas/cgminer apt-get install bz...

1. python跨目录调用模块

快速镜像安装第三方库 :  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy (三方库名字)         同目录下,我们可以直接调用模块,但是不同目录下调用模块却有些许不同。 假设我们的目录结构如下,我们需要在test.py中调用calultater.py:  一. 通过绝对路...

python 简单图像识别--验证码

python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦。 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便(https://files.cnblogs.com/files/Oran9e/PILwin64.zip)(https://files.cnblogs.com/...

Python36和Python27共存的方法

Python27和Python37环境的配置 设置环境变量 我的电脑右键属性-高级系统属性-环境变量 选择系统变量中的Path,双击打开 加入你的Python安装路径 C:Python27;C:Python27;Scripts;C:Python36;C:Python36Scripts; 把C:Python27目录下的Python.exe修改成Pytho...

python科学计算_scipy_常数与优化

scipy在numpy的基础上提供了众多的数学、科学以及工程计算中常用的模块;是强大的数值计算库; 1. 常数和特殊函数 scipy的constants模块包含了众多的物理常数: import scipy.constants as CC.c  #真空中的光速C.h  #普朗克常数C.pi #圆周率  在C.physical_constants字典中,通过物...