小白的Python之路 day4 装饰器前奏
装饰器前奏:
一.定义:
1.装饰器本质是函数,语法都是用def去定义的
(函数的目的:他需要完成特定的功能)
2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能)
二.原则:
1. 不能修改被装饰的函数的源代码
2. 不能修改被修饰的函数的调用方式
三. 实现装饰器知识储备:
1.函数即“变量” (先定义,再调用)
2.高阶函数
3.嵌套函数
4.匿名函数 样式 (calc = lambde x:x*3 )
高阶函数 + 嵌套函数 =》 装饰器
1. 函数即“变量”
(1). python的内存机制
|
1
2
3
4
5
|
#变量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函数没有定义
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#bar函数没有定义def foo(): print("in the foo") bar()foo()#输出in the fooNameError: name 'bar' is not defined |

②bar函数在foo函数之后定义
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#bar函数在foo函数之后定义def foo(): print("in the foo") bar()def bar(): print("in the bar")foo()#输出in the fooin the bar |

③bar函数是在foo函数之前定义
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# bar函数是在foo函数之前定义def bar(): print("in the bar")def foo(): print("in the foo") bar()foo()#输出in the fooin the bar |
显然,两种写法效果是一样的,那我们来看看第四种情况。
④bar函数在foo函数调用之后声明
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# bar函数在foo函数调用之后声明def foo(): print("in the foo") bar()foo()def bar(): print("in the bar")#输出Traceback (most recent call last):in the foo File "D:/PycharmProjects/pyhomework/day4/装饰器/函数即变量.py", line 31, in <module> foo() File "D:/PycharmProjects/pyhomework/day4/装饰器/函数即变量.py", line 29, in foo bar()NameError: name 'bar' is not defined #bar函数没有定义 |
2.高阶函数
满足下面条件之一就可以称为高阶函数:
a.把一个函数名当做实参传给另一个函数
b.返回值中包含函数名(调用函数体)
1、把一个函数名当做实参传给另外一个函数
作用:在不修改被装饰函数源代码的情况下为其添加功能
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def bar(): time.sleep(3) print("in the bar")def test1(func): print(func) start_time = time.time() func() #run bar stop_time = time.time() print("the func run the is %s"%(stop_time-start_time))#没有修改bar的代码test1(bar) #把bar函数名当做实参传到test1中#输出<function bar at 0x0000000000A7D378> #bar函数的内存地址in the barthe func run the is 2.9912972450256348 |
2、返回值中包括函数名
作用:不修改函数调用方式
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import timedef bar(): time.sleep(3) print("in the bar")def test2(func): print(func) return func #返回函数的内存地址#调用test2函数bar = test2(bar) bar() #没有bar函数改变调用方式#输出<function bar at 0x0000000000B6D378> #打印bar函数的内存地址in the bar |
小白的Python之路 day4 装饰器前奏的更多相关文章
- 小白的Python之路 day4 装饰器高潮
首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...
- python之路之装饰器
一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...
- [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)
一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...
- 小白的Python之路 day4 生成器
一.列表生成式 看下面例子: 列表生成式的作用:主要是让代码更简洁(还有装X的效果) 二.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...
- 小白的Python之路 day4 迭代器
迭代器 学习前,我们回想一下可以直接作用于for循环的数据类型有以下几种: 1.集合数据类型,如list.tuple.dict.set.str等: 2.是generator,包括生成器和带yield的 ...
- 小白的Python之路 day4 json and pickle数据标准序列化
一.简述 我们在写入文件中的数据,只能是字符串或者二进制,但是要传入文件的数据不一定全是字符串或者二进制,那还要进行繁琐的转换,然后再读取的时候,还要再转回去,显得很麻烦,今天就来学习标准的序列化:j ...
- 小白的Python之路 day4 软件目录结构规范
软件目录结构规范 为什么要设计好目录结构? "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同 ...
- 小白的Python之路 day4 不同目录间进行模块调用(绝对路径和相对路径)
一.常用模块调用函数功能解释 1.__file__ 功能:返回自身文件的相对路径 你从pycharm的执行结果可以看出,在pycharm执行atm.py文件时,是从绝对路径下去执行的,而你从cmd下去 ...
- 小白的Python之路 day4 生成器并行运算
一.概述 我们已经明白生成器内部的结构,其实就是通过像函数这样的东西实现的! 多线程和单线程:简单来说多线程就是并行运算,单线程就是串行运算 二.生成器执行原理 第一步:生成一个生成器 第二步:执行 ...
随机推荐
- Samples for Parallel Programming with the .NET Framework
The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...
- sockt初级了解 感悟 一起打怪升级偶
刚接触来谈谈对sockt基础的一点理解,多线性下次再发.也逛了逛博客,有一篇基础讲的停息在这推荐下sockt套接字编程全绍辉 首先贴下代码#服务器 import socket skt=socket.s ...
- laravel MethodNotAllowedHttpException错误一个原因
前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...
- 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)
微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...
- Resin4安装配置
#Resin4安装配置 # Resin4安装配置 #centos6 #参考http://467754239.blog.51cto.com/4878013/1558435 #yum -y install ...
- Python资料汇总(建议收藏)
整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. https://st ...
- MySQL服务找不到了,navicat打不开数据库连接
今天打开Navicat看看连接名,突然发现连接不上了,打开服务发现MySQL服务不见了,所以手动安装了遍MySQL服务. 详细步骤如下: 1.管理员身份打开cmd,切换到MySQL安装目录下的bin目 ...
- day1 python基础知识
一:python发展 python2.6与python3.0区别: 源码不标准,混乱,重复代码过多 二:python所属类型 (1)编译型:一次性将程序全部编译成二进制 优点:运行速度快 缺点:不能跨 ...
- lodash源码分析之compact中的遍历
小时候, 乡愁是一枚小小的邮票, 我在这头, 母亲在那头. 长大后,乡愁是一张窄窄的船票, 我在这头, 新娘在那头. 后来啊, 乡愁是一方矮矮的坟墓, 我在外头, 母亲在里头. 而现在, 乡愁是一湾浅 ...
- Android异步消息机制
Android中的异步消息机制分为四个部分:Message.Handler.MessageQueue和Looper. 其中,Message是线程之间传递的消息,其what.arg1.arg2字段可以携 ...