利用世界杯,读懂 Python 装饰器

Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性,

熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。

利用世界杯,读懂 Python 装饰器

今天就结合最近的世界杯带大家理解下装饰器。

德国战车

6 月 17 日德国战墨西哥,小痴虽然是一个伪球迷,但每年的世界杯还是会了解下。而德国是上届的冠军,又是这届夺冠热门。德意志战车在 32 年间小组赛就没有输过!卧槽!虽然小痴很少赌球,但这次德国如此强大,肯定会赢吧。搏一搏单车变摩托!随后小痴买了德国队赢。心里想着这次肯定稳了!赢了会所嫩模!小痴连比赛都不看,美滋滋的敲着代码。

利用世界杯,读懂 Python 装饰器

然后比赛结果却是德国爆冷 0:1 输给墨西哥队,德国队输了比赛,小痴也下海干活。只是此时的天台有点挤,风还有大。

利用世界杯,读懂 Python 装饰器

小痴含泪的写下了下面的代码:

def guess_win(func):

def rooftop_status():

result = func()

print('天台已满,请排队!') return result return rooftop_status@guess_windef german_team():

print('德国必胜!')

复制代码

输出结果:

德国必胜!

天台已满,请排队!

复制代码

装饰器是什么

首先我们先来了解下什么是装饰器,严格来说,装饰器只是语法糖,装饰器是可调用的对象,可以像常规的可调用对象那样调用,特殊的地方是装饰器的参数是一个函数。

装饰器的存在是为了适用两个场景,一个是增强被装饰函数的行为,另一个是代码重用。

利用世界杯,读懂 Python 装饰器

比如在上面的例子中我们在压德国队赢的时候,原本的 german_team() 函数只是输出德国必胜,但在使用装饰器(guess_win)后,它的功能多了一项:输出「天台已满,请排队!」。这就是一个简单的装饰器,实现了「增强被装饰函数的行为」。

一个良好的装饰器必须要遵守两个原则:

1 不能修改被装饰函数的代码

2 不能修改被装饰函数的调用方式

这里并不难以理解,在现在的生产环境中,很多代码是不能轻易的改写,因为这样有可能发送意想不到的影响。还有一点就是我们在看大神的代码,我们根本不懂如何改写。同时你也不能修改调用方式,因为你并不知道有在一个项目中,有多少处应用了此函数。

装饰器理解基础

如果你想要很好的理解装饰器,那下面的两个内容需要你先有所认知。

1 函数名可以赋值给变量

2 高阶函数

1 函数名可以赋值给变量

我们来看下这个例子:

def func(name):

print('我是{}!慌的一逼!'.format(name))

func('梅西')

y = func

y('勒夫')

复制代码

输出结果:

我是梅西!慌的一逼!

我是勒夫!慌的一逼!

复制代码

在代码中我们首先定义了函数 func,并调用了 func 函数,并且把 func 赋值给 y。y = func 表明了:函数名可以赋值给变量,并且不影响调用。

利用世界杯,读懂 Python 装饰器

这样讲,可能还有些人不太明白。我们在来对比下我们常用的操作。这其实和整数、数字是一样的,下面的代码你肯定熟悉:

a = 1

b = a

print(a, b)

复制代码

2 高阶函数

高阶函数满足如下的两个条件中的任意一个:a.可以接收函数名作为实参;b.返回值中可以包含函数名。

在 Python 标准库中的 map 和 filter 等函数就是高阶函数。

利用世界杯,读懂 Python 装饰器

l = [1, 2, 4]

r = map(lambda x: x*3, l)for i in r:

print('当前天台人数:', i)

复制代码

输出结果:

当前天台人数: 3

当前天台人数: 6

当前天台人数: 12

复制代码

自定义一个能返回函数的函数,也是高阶函数:

def f(l):

return map(lambda x: x *5, l)

a = f(l)for i in a:

print('当前天台人数:', i)

复制代码

输出结果:

当前天台人数: 5

当前天台人数: 10

当前天台人数: 20

复制代码

实现一个类似的装饰器

现在你已经知道了「函数名赋值」和「高阶函数」,有了这两个基础,我们就可以尝试实现一个类似的装饰器。

def status(func):

print('慌的一逼!') return funcdef name():

print('我是梅西!')

temp = status(name)

temp()

复制代码

输出结果:

慌的一逼!

我是梅西!

复制代码

利用世界杯,读懂 Python 装饰器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydsjx.html