(转)Python3.5——装饰器及应用详解
原文:https://blog.csdn.net/loveliuzz/article/details/77853346
Python3.5——装饰器及应用详解(下)----https://blog.csdn.net/loveliuzz/article/details/77883709
Python 装饰器记录总结 (终极版)-------------https://juejin.im/entry/58eb90b90ce46300586c2830
1、装饰器:
(1)本质:装饰器的本质是函数,其基本语法都是用关键字def去定义的。
(2)功能:装饰其他函数,即:为其他函数添加附加功能。
(3)原则:不能修改被装饰的函数的源代码,不能修改被装饰的函数的调用方式。即:装饰器对待被修饰的函数是完全透明的。
(4)简单应用:统计函数运行时间的装饰器
import time
#统计函数运行时间的砖装饰器
def timmer(func):
def warpper(*args,**kwargs):
strat_time = time.time()
func()
stop_time = time.time()
print("the func run time is %s" %(stop_time-strat_time))
return warpper
@timmer
def test1():
time.sleep(3)
print("in the test1")
test1()
#运行结果:
#in the test1
#the func run time is 3.000171661376953
(5)实现装饰器知识储备:
a、函数即“变量”
b、高阶函数
c、函数嵌套
d、高阶函数+嵌套函数==》装饰器
2、装饰器知识储备——函数即“变量”
定义一个函数,相当于把函数体赋值给这个函数名。
Python解释器如何回收变量:采用引用计数。当引用有没有了时(门牌号不存在),变量就被回收了。
函数的定义也有内存回收机制,与变量回收机制一样。匿名函数没有函数名,就会被回收。
变量的使用:先定义再调用,只要在调用之前已经存在(定义)即可;函数即“变量”,函数的使用是一样的。
函数调用顺序:其他的高级语言类似,Python 不允许在函数未声明之前,对其进行引用或者调用
下面的两段代码运行效果一样:
def bar():
print("in the bar")
def foo():
print("in the foo")
bar()
foo()
#python为解释执行,函数foo在调用前已经声明了bar和foo,所以bar和foo无顺序之分
def foo():
print("in the foo")
bar()
def bar():
print("in the bar")
foo()
#运行结果:
#in the foo
#in the bar
#in the foo
#in the bar
注意:python为解释执行,函数foo在调用前已经声明了bar和foo,所以bar和foo无顺序之分
原理图为:
3、装饰器知识储备——高阶函数
满足下列其中一种即可称之为高阶函数:
a、把一个函数名当做实参传递给另一个函数(在不修改被装饰函数的情况下为其添加附加功能)
b、返回值中包含函数名(不修改函数的调用方式)
(1)高阶函数示例:
def bar():
print("in the bar")
def test1(func):
print(func) #打印门牌号,即内存地址
func()
test1(bar) #门牌号func=bar
#运行结果:
#<function bar at 0x00BCDFA8>
#in the bar
(2)高阶函数的妙处——把一个函数名当做实参传递给另一个函数(在不修改被装饰函数的情况下为其添加附加功能)
import time
def bar():
time.sleep(3)
print("in the bar")
#test2在不修改被修饰函数bar的代码时添加了附加的及时功能
def test2(func):
start_time = time.time()
func() #run bar
stop_time = time.time()
print("the func run time is %s " %(stop_time-start_time))
#调用方式发生改变,不能像原来的方法去调用被修饰的函数(所以不能实现装饰器的功能)
test2(bar)
#bar()
#运行结果:
#in the bar
#the func run time is 3.000171661376953
(3)高阶函数的妙处——返回值中包含函数名(不修改函数的调用方式)
import time
def bar():
time.sleep(3)
print("in the bar")
def test3(func):
print(func)
return func
bar = test3(bar)
bar() #run bar
#运行结果:
#<function bar at 0x00BADFA8>
#in the bar
4、装饰器知识储备——嵌套函数
#函数嵌套
def foo():
print("in the foo")
def bar(): #bar函数具有局部变量的特性,不能在外部调用,只能在内部调用
print("in the bar")
bar()
foo()
#运行结果:
#in the foo
#in the bar
(转)Python3.5——装饰器及应用详解的更多相关文章
- Python装饰器执行顺序详解
探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...
- python3.7 装饰器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- ubuntu 下命令行播放器mplayer 使用详解
ubuntu 下命令行播放器mplayer 使用详解 2011-01-02 21:00:42| 分类: Linux/Unix | 标签: |字号大中小 订阅 使用 MPlayer 播放媒体文件最简 ...
- 【python3+request】python3+requests接口自动化测试框架实例详解教程
转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...
- Python3、setuptools、Pip3安装详解
Python3.setuptools.Pip3安装详解 2017年08月19日 18:58:47 安静的技术控 阅读数:26002 版权声明:本文为博主原创文章,未经博主允许不得转载. http ...
- Python3调用C程序(超详解)
Python3调用C程序(超详解) Python为什么要调用C? 1.要提高代码的运算速度,C比Python快50倍以上 2.对于C语言里很多传统类库,不想用Python重写,想对从内存到文件接口这样 ...
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- Python3.5:装饰器的使用
在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... pr ...
随机推荐
- 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...
- (KMP 字符串处理)Substrings -- hdu -- 1238
http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit:1000MS Memory Limit:32768KB ...
- hdu 4957 贪心破木桶接水大trick
http://acm.hdu.edu.cn/showproblem.php?pid=4957 拿n只破的木桶去接水,每只木桶漏水速度为a[i],最后要得到b[i]单位的水,自来水的出水速度为V,木桶里 ...
- JS的__proto__与prototype
一.prototype和__proto__的概念 prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. __p ...
- Python学习-37.Python中的正则表达式
作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...
- linux系统编程之文件与IO(四):目录访问相关系统调用
1. 目录操作相关的系统调用 1.1 mkdir和rmdir系统调用 1.1.1 实例 1.2 chdir, getcwd系统调用 1.2.1 实例 1.3 o ...
- Replication--查看未分发命令和预估所需时间
当复制有延迟时,我们可以使用复制监视器来查看各订阅的未分发命令书和预估所需时间,如下图: 但是当分发和订阅数比较多的时候,依次查看比较费时,我们可以使用sys.sp_replmonitorsubscr ...
- rtmp官方标准规范详细解析
标准规范学习: rtmp消息结构,包括几个部分: 时戳:4 byte,单位毫秒.超过最大值后会翻转. 长度:消息负载的长度. 类型ID:Type Id 一部分ID范围用于rtmp的控制信令.还有一部 ...
- IIS配置404页面配置,IIS自定义404页面
.NET 环境下 用到404页的场景一般有两种: 场景一:报黄页,程序性的错误,代码层可以捕捉到的. 场景二:用户输入不存在的页面,代码层捕捉不到的. IIS 默认会有404的配置,不过这种呈现出的都 ...
- 基于VMware Workstation搭建开发服务器
基于VMware Workstation搭建开发服务器 文章为本人原创,转载请联系作者并注明出处.晓松 源URL: https://www.jianshu.com/p/e62ab7de0124 我 ...