Python函数(八)-装饰器(一)
装饰器通过函数来定义,用来装饰函数
装饰器的结构为高阶函数和内嵌函数
装饰器不改变被装饰函数的源代码和运行方式
如何实现这个效果呢?
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" import time def timer(func): #定义一个装饰器
def deco():
start_time = time.time()
func()
stop_time = time.time()
print("the run time is %s"%(stop_time-start_time))
return deco def test1():
time.sleep(3)
print('in the test1') test1 = timer(test1)
test1()
既没有改变被装饰函数的源代码,也没有改变它的运行方式
运行

这么写有些复杂,可以直接在函数前调用装饰器
调用装饰器的格式为:@装饰器名
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" import time def timer(func): #定义一个装饰器
def deco():
start_time = time.time()
func()
stop_time = time.time()
print("the run time is %s"%(stop_time-start_time))
return deco @timer #相当于test1 = timer(test1)
def test1():
time.sleep(3)
print('in the test1') test1()
运行

执行过程:
先走test1函数前的装饰器timer(),然后在timer()函数内走函数deco(),记录下start_time,然后deco()函数调用函数test1(),然后执行完函数test1()后,记录下stop_time,最后计算时间并打印
虽然装饰器不会修改被装饰函数的源代码和运行方式,但是不能直接返回函数的返回值
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" import time def timer(func): #定义一个装饰器
def deco():
start_time = time.time()
func()
stop_time = time.time()
print("the run time is %s"%(stop_time-start_time))
return deco @timer #test1 = timer(test1)
def test1():
time.sleep(3)
print('in the test1')
return "test1" print(test1())
运行结果

打印的返回值为None,因为这个返回值为装饰器里的内嵌函数的返回值
如果需要打印被装饰函数的返回值的话,需要在装饰器里的内嵌函数中返回
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" import time def timer(func): #定义一个装饰器
def doc():
start_time = time.time()
func()
stop_time = time.time()
print("the run time is %s"%(stop_time-start_time))
return func()
return doc @timer #test1 = timer(test1)
def test1():
time.sleep(3)
print('in the test1')
return "test1" print(test1())
运行结果

Python函数(八)-装饰器(一)的更多相关文章
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- python——函数之装饰器
1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- Python 函数之装饰器
1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- Python函数加工厂-装饰器
引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...
- Python函数的装饰器
函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...
随机推荐
- Android Studio2.3中简单配置,释放C盘空间
重新安装了一下android studio,由于占用了太多的C盘空间.记录一下,在网上收集到的studio中两个主要占用C盘空间的文件,我们将它移除C盘. 原博地址: http://blog.csdn ...
- Flume-NG启动过程源码分析(三)(原创)
上一篇文章分析了Flume如何加载配置文件的,动态加载也只是重复运行getConfiguration(). 本篇分析加载配置文件后各个组件是如何运行的? 加载完配置文件订阅者Application类会 ...
- Codeforces Round #280 (Div. 2) A , B , C
A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 刻录DVD.Win7系统盘(U盘)
ZC:Win7x86的U盘安装盘做好之后,U盘 里面会留有 引导信息,在以后不想要它(引导信息)的时候 该如果将它删掉?直接普通的格式化 能行吗? ZC:(20180423)发现,UltraISO制作 ...
- LAMP环境搭建问题
//////////////////////////LAMP环境搭建问题///////////////////////////////////////LAMP常见的问题A.安装相关问题(1)MySQL ...
- Redis 存储机制
Redis存储机制分成两种Snapshot和AOF.无论是那种机制,Redis都是将数据存储在内存中. Snapshot工作原理: 是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触 ...
- iTunes 12恢复.ipsw固件
恢复.ipsw步骤: 1. 下载好与移动设备对应的.ipsw固件(zip文件可以解压出来). 2. 将移动设备连接到安装有iTunes的电脑,解锁并信任这台电脑 3. 启动iTunes,选择这个移动设 ...
- hdu 5242 Game(树链剖分,贪心¥)
Game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 简单实用的磁带转MP3方法图解
读完这篇文章,然后在看看文章的最后部分. [图文]磁带转Mp3教程 来源: 作者:netseeker 一.工具 1.音频线一条. 在一般的电器铺都能买到,8-15元不等,两头的接口是一样的,可以混用 ...
- vue cli关闭eslint严格语法检查
eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格. 官方文档:https://eslint.org 这篇文章总结了eslint的规则:Eslint规则说明 1.关闭e ...