装饰器

  1. 什么是装饰器?

    装饰:给已有的对象(函数)添加新的功能

    器:工具              在python中指具备某些功能的函数

    装饰器:装饰器就是一个给其他函数增加功能的函数

  2. 一种设计原则:

    开闭原则:对扩展开放

    对修改封闭

  3. 装饰器怎么用

我们用一个例子说明装饰器的作用及用法

例子: 现需要统计一段程序运行的时间

#统计程序运行时间,首先我们写一个程序
import time
def index():
time.sleep(1)
print('login')
#以上就是一个打印login的程序,该程序休眠时间为1S
#如果我们要增加一个计时功能,该怎么实现呢?首先我们可以尝试从我们的设计原则入手
#如果我们按照增加代码的形式可以看下:
import time
def index():
time.sleep(1)
print('login')
start=time.time()
index()
end = time.time()
print('程序运行的时间',end-start)
#或者
import time
def index():
time.sleep(1)
print('login')
def wrapper():
start=time.time
index()
end=time.time
print('程序运行时间',end-start)
wrapper()
#如果这样写我们就改变了源码或调用方式,不符合要求
#那我们按照不改变源码,不改变调用方式
#利用闭包函数
import time
def index():
time.sleep(1)
print('login')
def time_count(func):
#func=index #利用闭包函数的将变量func=index带给内部的wrapper函数
def wrapper():
start=time.time()
func()
end=time.time()
print('程序运行时间',end-start)
return wrapper #time_count函数的返回值为wrapper函数
index=time_count(index) #index=wrapper 括号内index为初始的index
index() #调用index就可以实现计时功能

为了让我们作的修改更能灵活,能继续增加功能,并且如果原代码函数有返回值,需要我们将返回值传递出来,我们可以将装饰器改成

import time
def time_count(func):
#func=index #利用闭包函数的将变量func=index带给内部的wrapper函数
def wrapper(*args, **kwargs):
start=time.time()
res=func(*args, **kwargs)
end=time.time()
print('程序运行时间',end-start)
return res
return wrapper #time_count函数的返回值为wrapper函数
@time_count
def index():
time.sleep(1)
print('login')
return 123
res=index()
print('返回值res',res)

这就是一个完整的装饰器

python语言中的函数装饰器的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  3. Python中的@函数装饰器到底是什么?

    在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...

  4. python学习日记(函数--装饰器)

    楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...

  5. 流畅的python第七章函数装饰器和闭包学习记录

    本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...

  6. Python: 无参数的函数装饰器

    写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...

  7. Python带参数的函数装饰器

    # -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...

  8. Python学习第四十一天函数装饰器传参数的用法

    在不改变函数的结构的基础,我们给函数加新的功能,用是函数装饰器,如果要给函数传递参数,那么应该怎么做呢 @timerdef test2(name,age): time.sleep(3) print(' ...

  9. python之路(九)-函数装饰器

    装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...

随机推荐

  1. DockerFile服务

    Dockerfile分为四部分:基础镜像信息.镜像创建者信息.镜像操作指令.容器启动执行指令. 一.Dockerfile的书写规则及指令使用方法 Dockerfile的指令是忽略大小写的,建议使用大写 ...

  2. Jmeter(二十四)Jmeter-Question之“加密请求参数”

    日常接口测试碰到参数加密的情况不在少数,当然与之相对的也有解密.直接记录实例: 排除各家用的不一样的加密方式,用的最多的还是MD5加密(16,32).Jmeter3.2版本已经有解决方案 1.${__ ...

  3. angular4+中的数据绑定

    1,基本的属性绑定,下面的两种形式是一样的 2.dom属性和html属性 3.两者关系的进一步总结 4.dom属性绑定 5.html属性绑定

  4. jstat 详解

    最近项目里面使用到了多线程,有时候多线程会存在挂掉的情况,趁机好好学习总结一下JVM调优的方法. jstat使用: #jstat -help|-options #jstat -<option&g ...

  5. sas 基础(1)-关于数据格式的SAS函数

    (一)字符转换: 1)字符型转换成数值型 Numvar=INPUT(source,informat) 2)数值型转换成字符型 Chavar=PUT(source,format) (二)字符型变量的处理 ...

  6. sql-datediff

    SQL中DateDiff的用法 DATEDIFF返回跨两个指定日期的日期和时间边界数. 语法DATEDIFF ( datepart , startdate , enddate ) 参数datepart ...

  7. protocol buf安装

    1:下载安装包 $wget https://github.com/google/protobuf/archive/v2.6.1.zip $unzip protobuf-2.6.1.zip $cd pr ...

  8. 外网访问内网的FTP服务器-原理解析

    1. 背景简介 最近研究如何在内网搭架FTP服务器,同时要保证外网(公网)能访问的到.终成正果,但走了一些弯路,在此记下,以飨后人. 2. 基础知识 FTP 使用 2 个端口,一个数据端口和一个命令端 ...

  9. rpm和yum的区别

    rpm 只能安装已经下载到本地机器上的rpm 包, yum能在线下载并安装rpm包,能更新系统,且还能自动处理包与包之间的依赖问题,这个是rpm 工具所不具备的.

  10. day19常用模块2

    常用模块21 shelve模块  也是一种序列化方式    使用方法        1.open     sl = shelve.open("shelvetest.txt")   ...