装饰器通过函数来定义,用来装饰函数

装饰器的结构为高阶函数和内嵌函数

装饰器不改变被装饰函数的源代码和运行方式

如何实现这个效果呢?

# -*- 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函数(八)-装饰器(一)的更多相关文章

  1. Python函数06/装饰器

    Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...

  2. python——函数之装饰器

    1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...

  3. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  4. Python 函数之装饰器

    1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  5. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  6. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...

  7. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...

  8. Python函数加工厂-装饰器

    引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...

  9. Python函数的装饰器

    函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...

随机推荐

  1. 使用Properties读写属性文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; /*Prop ...

  2. Boostarp-响应式

    一.响应式 响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式怎么实现的? 1. CSS3 media query 媒体查询 2. JS去控制网页的布局和样式等 ...

  3. Tensorflow搭建神经网络及使用Tensorboard进行可视化

    创建神经网络模型 1.构建神经网络结构,并进行模型训练 import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt ...

  4. java导包

    下载响应的zip文件,就可以导入了,导入src目录也是可以的.

  5. bt种子文件是什么(包括bt文件结构)

    bt种子文件是什么(包括bt文件结构) 一.总结 一句话总结:带特定格式特定信息(资源的url相关信息)的一个字符串(和json有点异曲同工之妙的感觉). 1.bt种子文件和json的区别和联系? 共 ...

  6. Eclipse里面新建servlet 是否需要配置web.xml

    在新建的时候可选时候映射,如果选择了映射,那么就会在servle开头的地方有一行@servlet(""),这就完成了映射.注释掉这行就需要在web.xml中设置了

  7. poj3252 数位dp

    这题不是用10进制储存的,要转化成2进制再计算 dp[i][j][k]   i是位数,j是1的个数,k是0的个数 #include<map> #include<set> #in ...

  8. 【WPF】DataGrid的Row样式设置

    引言      在与DataGrid相关的项目中,会有一个比较常见的需求.那就是在根据数据设置行的样式,例如行的背景色或者字体色.我们用到的方法有几个,下面一个个说来. 准备工作     介绍方法之前 ...

  9. LeetCode OJ:Summary Ranges(概括区间)

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...

  10. 条款36:绝对不要重新定义,继承而来的non-virtual函数

    重新定义一个继承而来的non-virtual函数可能会使得导致当函数被调用的时候,被调用的函数不是取决于调用的函数究竟属于的对象,而是取决于调用函数的指针或者引用的类型. 所以一般的说主要有两种观点在 ...