一. 装饰器是什么?

  简单来说,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问。

二.装饰器语法

  (1)无参数装饰器

 def deco(func):
print (func)
return func
@deco
def foo():
pass
foo()

  第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(记住一定要返回 ,不然外面调用foo的地方将会无函数可用。实际上此时foo=deco(foo)

  下面是一个简单的例子,检查函数有没有说明文档:

 def deco_functionNeedDoc(func):
if func.__doc__ == None :
print (func.__name__, "has no __doc__, it's a bad habit.")
else:
print (func.__name__, ':', func.__doc__, '.')
return func
@deco_functionNeedDoc
def f():
print ('f() Do something')
@deco_functionNeedDoc
def g():
'I have a __doc__'
print ('g() Do something')
f()
g() #输出如下
#f has no __doc__, it's a bad habit.
#g : I have a __doc__ .
#f() Do something
#g() Do something
#[Finished in 0.2s]

  (2)有参数装饰器

  不使用装饰器的实现代码:

import time
import datetime def outter(func):
def inner(args):
start=datetime.datetime.now()
func(args)
end=datetime.datetime.now()
cost=end-start print("execute %s spend %s"%(func.__name__,cost.total_seconds()))
return (inner) def func2(args):
time.sleep(args) f=outter(func2)
f(1) #输出如下:
#execute func2 spend 1.014
#[Finished in 1.2s]

  使用装饰器的代码实现如下:

 import time
import datetime
import functools def outter(func):
@functools.wraps(func)
def inner(*args,**kwargs):
'''This is inner'''
start=datetime.datetime.now()
func(*args,**kwargs)
end=datetime.datetime.now()
cost=end-start print("execute %s spend %s"%(func.__name__,cost.total_seconds()))
return (inner) @outter
def func2(args):
'''This is func2'''
time.sleep(args) @outter
def func3(m,n):
'''This is func3'''
print("m+n={0}".format(m+n)) func2(1)
print(func2.__name__)
print(func2.__doc__) func3(m=2,n=3)
print(func3.__name__)
print(func3.__doc__) #加了@functools.wraps(func)装饰器的输出结果
# execute func2 spend 1.000413
# func2
# This is func2
# m+n=5
# execute func3 spend 0.0
# func3
# This is func3
# [Finished in 1.2s] #不加@functools.wraps(func)装饰器的输出结果 # execute func2 spend 1.000413
# inner
# This is inner
# m+n=5
# execute func3 spend 0.0
# inner
# This is inner
# [Finished in 1.2s]

Python中的装饰器的简单介绍01的更多相关文章

  1. Python中的装饰器的简单介绍02

    这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...

  2. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  3. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

  4. 【Python】python中的装饰器——@

    对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...

  5. Python 中实现装饰器时使用 @functools.wraps 的理由

    Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过  ...

  6. 写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...

  7. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...

  8. 三分钟搞定Python中的装饰器

    python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...

  9. 浅显易懂的谈一谈python中的装饰器!!

    hello大家好~~我是稀里糊涂林老冷,一天天稀里糊涂的. 前一段时间学习了装饰器,觉着这东西好高大上哇靠!!哈哈,一定要总结一下,方便以后自己查阅,也希望帮助其他伙伴们共同进步! 装饰器: 大家可以 ...

随机推荐

  1. 使用PageHelper插件分页结合mybatis返回的列表个数不对问题解决

    问题描述:spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对.比如每页查询10条,返回2条或者3条.r ...

  2. 编写装饰器实现python请求错误重试功能

    在做接口自动化测试的时候,总会遇到,因连接超时等错误导致,接口脚本失败. 官方给出的方法: max_retries=5 出错重试5次注意的是,这个只对DNS,连接错误进行重试. from reques ...

  3. CDN和智能DNS原理和应用 (原)

    CDN是什么? CDN的全称是Content Delivery Network,即内容分发网络. CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...

  4. Java项目中的异常处理情况

    1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象 ...

  5. centos7中安装、配置jdk(转载)

    参考命令:http://www.jb51.net/os/RedHat/73016.html来进行安装 安装说明 系统环境:centos7安装方式:rpm安装软件:jdk-8u25-linux-x64. ...

  6. 论文阅读(XiangBai——【AAAI2017】TextBoxes_A Fast Text Detector with a Single Deep Neural Network)

    XiangBai——[AAAI2017]TextBoxes:A Fast Text Detector with a Single Deep Neural Network 目录 作者和相关链接 方法概括 ...

  7. C#计算重重字符串,出现的次数

    int bac = System.Text.RegularExpressions.Regex.Matches(“字符串”, @"要计算的").Count;        //字符串 ...

  8. Linux进程相关命令使用场景

    Linux进程相关命令使用场景 在Linux系统上工作时,我们常常会碰到很多和进程相关的查询场景,今天在这里进行详细的讲解,进程相关的对象包括以下几个: 端口:Port 进程号:PId 执行文件所在路 ...

  9. Weighted Quick Union with Path Compression (WQUPC)

    在WQU基础上,添加一步路径压缩. 前面的优化都是在union,路径压缩是在find上面做文章. 这里的路径压缩我还没完全搞明白,之后不断再来的,不管是理解还是博文编排素材之类的. 说是加一步压缩是确 ...

  10. oracle常用的数据字典查询语句

    select * from all_source where owner='user_name' and type = 'PROCEDURE' and upper(text) like upper(' ...