(转)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 ...
随机推荐
- 在windows7下创建ftp服务站点
1.开始->控制面板->程序(点击“卸载程序”)->启动或关闭windows功能->Internet Information Services(Internet信息服务)-&g ...
- CIC仿真
在调用CIC时发现的,明确告诉调用那些库. CIC的设置窗口. 该CIC滤波器有两个输入一个输出.与下面的相比,同样要输出两路信号,但输出速率要高. 修改成以下的设置 设置一个接口,两个通道. 该设置 ...
- Nvidia显卡驱动下载
https://www.nvidia.cn/Download/index.aspx?lang=cn https://blog.csdn.net/weixin_39643690/article/deta ...
- (网络流 匹配 KM) Going Home --poj -- 2195
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/D 有n个人有n栋房子,每栋房子里能进一个人,但每走一格 ...
- log4j自动加载原理
java虚拟机加载log4j的类(LogManager.class)后,执行静态代码块,这个类中的静态代码块,会load log4j的配置文件,依次加载log4j.xml,log4j.properti ...
- Hibernate 注解和配置文件两种方法的对比(有实例)
hibernate多对多形式(User类<---->Educate类) 1.基于注解的形式: User类: package com.ssh.entities; import java.ut ...
- ibatIs中的isNotNull、isEqual、isEmpty
isNull判断property字段是否是null,用isEmpty更方便,包含了null和空字符串 例子一:isEqual相当于equals,数字用得多些,一般都是判断状态值<isEqual ...
- TFS 2015 生成不输出任何结果
这是一台用于测试的TFS 2015服务器,其中的数据是通过备份和还原,在使用应用层专用的方式配置出来的. 在配置完成代理服务器以后,运行生成,发现在获取代码之前就停止失败了,并且在生成过程中没有任何结 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (三)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- 关于ORACLE的字符窜存储(未完善,欢迎补充)
oracle中常见的用于存储字符串的数据类型有: 数据类型 是否定长 最多存储数 效率排行 备注 是否oracle特有 英文占位 中文占位 char 是 2000 比VARCHAR2稍高 char的长 ...