Python|实现一个装饰器我们需要了解哪些知识?

Python|实现一个装饰器我们需要了解哪些知识?

装饰器在python里面是很重要的一个东西。

定义:

装饰器本质是函数,其实就是为其它函数添加附加功能

原则:

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

实现装饰器的知识储备

  • 函数即变量
  • 高阶函数
  • 函数的嵌套

简之:高阶函数+嵌套函数=====>装饰器

函数即“变量”

Python|实现一个装饰器我们需要了解哪些知识?

来看这样一张图。我们知道我们定义一个变量其实是在内存中开辟了一块内存,1是实实在在存入内存的数据,而x为该内存位置的地址,大家都打比方说这就像一个门牌号,人是住在房子里面的,就像这个1。那么当执行y=x的时候,其实就给它添加了一个门牌号,使该地址能2次引用了。同样的在python里面,函数也是这样在内存中存储的,函数体里面的内容,这个内容其实就是一些字符串被存在了内存里面,而函数名其实就是门牌号,为这个存放函数体的内存的地址。那么python何时清空内存了,这就要说到python的内存回收机制了,其实当没有门牌号的时候,即无人引用的时候,python会自动回收这个内存空间的,也就是python每隔一段时间就去看一遍,要是哪个房子没有了门牌号,那就说明这个内存没用了,就直接回收了。人为del一下其实也是删除了门牌号,内存数据的清除还是靠python的内存回收机制完成的。在这我们再说一下匿名函数,这个匿名函数没有函数名啊,那不是出来就被回收了,是这样的,但是,你在用lambda x:x*3的时候,一般都是这样用的calc=lambda x:x*3,你把这个函数赋值给了一个变量,那瞬时就有门牌号了。

总结一下:函数就是变量,定义一个函数相当于把这个函数体赋值给了这个函数名。函数也有内存回收机制。

高阶函数

需满足下列条件之一:

  • 把一个函数名当做实参传给另外一个函数
  • 返回值中包含函数名

看例子

  1. 把一个函数名当做实参传给另外一个函数
Python|实现一个装饰器我们需要了解哪些知识?

可以看出这种情况,可以在不修改被修饰函数源代码的情况下为其添加功能。

  • 2.返回值中包含函数名
Python|实现一个装饰器我们需要了解哪些知识?

可以看出这种情况下,函数的调用方式没有改变。

嵌套函数

Python|实现一个装饰器我们需要了解哪些知识?

其实就是在函数里面再定义一个函数。有点像局部变量的定义。

下一篇就进入正题了,主要来看看python装饰器的实现和应用了。



分享到:


相關文章: