装饰器-Day4
Posted Wesley·zk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器-Day4相关的知识,希望对你有一定的参考价值。
一、装饰器的概述
装饰器又称语法糖,本质是函数,用来装饰其他函数,顾名思义就是为其他函数添加其他功能。
二、装饰器的原则
- 不能修改被装饰函数的源代码
- 不能修改被装饰函数的调用方式
装饰器为什么会有这两个原则?因为如果写的程序在生产环境下已经运行了,修改别人的源代码或者别人的调用方式,后果可想而知。
三、实现装饰器的知识储备
- 函数即变量
- 高阶函数
- 嵌套函数
四、函数即变量
1、python的内存机制
x = 1 #变量 def test(): #函数 pass
以上一个和一个函数在内存中的表现形式如下图:
在python解释器中,有一个概念叫做引用基数,就是比方说,x=1,它会先在内存当中把1这个值实实在在的存放下来,这个x其实就是1的门牌好,也是对1的一次引用。python什么时候把这个1的屋子清空呢?它会等到1所对应的门牌号都没有了,就会把1这里面的东西给清掉,这个也就是python的内存回收机制。
2、del清理
那我们用什么清理呢?用del去清理门牌号,就是对1的值引用的变量,del x表示清理掉1对应的x的门派好。如果x没有del,则x永远不还被删除,除非程序结束了,不然永远不会被删除。del删除的不是1,只是把门牌号x删除了,然后定期刷新时,发现1没有被其他门牌号引用了,才会被真正被清理掉。
3、函数在内存的表现形式
我们先通过三个例子来解释一下:
示例一:bar函数在foo函数之后定义
def foo(): print(\'in the foo\') bar() def bar(): print(\'in thre bar\') foo() #返回值 in the foo in thre bar
示例二:foo函数在bar函数之后定义
def bar(): print(\'in thre bar\') def foo(): print(\'in the foo\') bar() foo() #返回值 in the foo in thre bar
示例三:bar函数在foo函数调用之后申明
def foo(): print(\'in the foo\') bar() foo() #foo()函数执行时未在内存中发现bar()函数 def bar(): print(\'in the bar\') #返回值 Traceback (most recent call last): File "E:/python/day4/decorator1.py", line 11, in <module> foo() File "E:/python/day4/decorator1.py", line 9, in foo bar() NameError: name \'bar\' is not defined
为啥呢?bar函数我不是定义了吗,下面画图举例
从图中不难看出第三种错误是因为在执行foo函数时,调用bar函数时,无法再内存中查找到bar函数的内存地址,所以报错
以上是关于装饰器-Day4的主要内容,如果未能解决你的问题,请参考以下文章