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

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

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

如何实现这个效果呢?

# -*- 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. 使用UNIDAC连接oracle时的参数设置

    在uniconnection1里设置: server项位hostip:port:sid,如10.53.x.XX:1521:or10g 然后在Options里设置: charset:utf8 direc ...

  2. 【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)

    题目传送门:bzoj2118 洛谷P2371 这道题看了题解后才会的..果然是国家集训队的神仙题,思维独特. 首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每 ...

  3. java深入探究10-文件上传组件FileUpload,邮件开发

    1.文件上传组件FileUpload 1)java提供了文件上传的工具包 需要引入:commons-fileupload-1.2.1.jar(文件上床组件核心包) commons-oi-1.4(封装了 ...

  4. java深入探究09-Filter,Listener,国际化

    1.Filter过滤器 1)为是么有过滤器 开发项目中经常遇到直接登录主页面要判断用户是否合法,这类代码比较重复,可以通过过滤器来解决 2)过滤器原理生命周期 服务器创建过滤器对象->一个执行i ...

  5. MapReduce-边数据

    边数据 边数据(side data)是作业所需的额外的只读数据,以辅助处理主数据集.所面临的挑战在于如何使所有map或reduce任务(这些任务散布在集群内部)都能够方便而高效地使用边数据. 利用Jo ...

  6. Windows10安装Linux子系统

    在win10上面可以直接在powershell里面安装Linux,具体步骤如下: 首先我们要打开Windows功能 在这里把勾打上 然后打开设置>>更新和安全>>针对开发人员, ...

  7. web自动化:元素定位(二)

    一. 实例 如何定位到下图第二个"抢投标",有一种方法是利用xpath定位 //a[@href="/loan/loan_detail/Id/7190.html" ...

  8. nyojb 2359 巴什博弈变形

    http://acm.nyist.me/JudgeOnline/problem.php?id=2359 2359: 巴什博弈? 时间限制: 1 Sec  内存限制: 30 MB提交: 237  解决: ...

  9. ZeroClipboard 简单应用

    ZeroClipboard.config({ swfPath: "/scripts/ZeroClipboard.swf" }); var client = new ZeroClip ...

  10. Django 基础 路由系统

    Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...