首页 > 其他 > 详细

装饰器-Day4

时间:2018-01-09 19:52:07      阅读:283      评论:0      收藏:0      [点我收藏+]

---恢复内容开始---

一、装饰器的概述

装饰器本质是函数,用来装饰其他函数,顾名思义就是为其他函数添加附件功能。

二、装饰器的原则

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

装饰器为什么会有这两个原则?因为如果写的程序在生产环境下已经运行了,修改别人的源代码或者别人的调用方式,后果可想而知。

三、实现装饰器的知识储备

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

最终:高阶函数+嵌套函数=>装饰器

 

四、函数即变量

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函数的内存地址,所以报错

五、高阶函数

实现高阶函数有两个条件:

1、把一个函数名当做实参传给另外一个函数

2、返回值中包含函数名

 

装饰器-Day4

原文:https://www.cnblogs.com/szk5043/p/8252758.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!