欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

程序员文章站 2022-03-03 12:04:54
今天就结合最近的世界杯带大家理解下装饰器。 德国战车 然后比赛结果却是德国爆冷 0:1 输给墨西哥队,德国队输了比赛,小痴也下海干活。只是此时的天台有点挤,风还有大。 小痴含泪的写下了下面的代码: 装饰器是什么 首先我们先来了解下什么是装饰器,严格来说,装饰器只是语法糖,装饰器是可调用的对象,可以像 ......
你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

德国战车

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

装饰器是什么

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

  • 1 不能修改被装饰函数的代码
  • 2 不能修改被装饰函数的调用方式

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

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

a = 1
b = a
print(a, b)

2 高阶函数

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

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

实现一个类似的装饰器

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

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

要解决这个问题很简单,相信 a = a*3 这样的表达式大家都见过,那么上述代码中的 temp = status(name) 同样可以修改为 name = status(name),这样我们就完美的解决了问题:既添加新功能又没有修改原函数和其调用方式。修改后的代码如下:

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

这样我们就弄清楚了装饰器的工作原理:

  • 1 写一个高阶函数,即参数是函数,返回的也是函数。
  • 2 在利用语法糖@,简化赋值操作。

但是对比开头的例子,还是有些不一样。在开始的例子中,我们还实现了一个 rooftop_status 函数,来判断下当前的天台状是否人满。但是我们现在是直接返回了函数名,这样函数调用后我们就没办法做任何事情。梅西和德国慌了,我们也慌了,各个都要天台见,但在这之前我们也要考虑下天台的情况。

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

为了能判断天台的情况,所以此时我们需要在嵌套一层函数,将实现额外功能的部分写在内层函数中,然后将这个内层函数返回即可。这也是为什么装饰器都是嵌套函数的原因。

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

总结

装饰器的本质是函数,其参数是另一个函数(被装饰的函数)。装饰器通常会额外处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。行为良好的装饰器可以重用,以减少代码量。

对于这届的世界杯,我总结了下。

你赌球了吗?是天台见还是会所见?因为世界杯,我学会了Python

 

谢谢阅读,进群:125240963  即可获取神秘大礼包

原文:痴海