一. 装饰器是什么?

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

二.装饰器语法

  (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. Python学习之高级数组(一)

    1.Python基础学习之高级数组(一) 1.1视图:就是与较大数组共享相同数据的较小数组.Numpy包提供数据视图的概念是为了精确地控制内存的使用方式.  数组视图.切片视图.转置和重塑视图等 数组 ...

  2. HDU 2586 How far away(LCA+邻接表)

    How far away &题解: 和上篇是一样的题,这用的是lca方法做的, 不知道为什么,把数组开到80000 就a了 >_< 哈 我现在知道为什么了,因为我的rmq数组没有乘 ...

  3. MySQL变量的使用

    在mysql文档中,mysql变量可分为两大类,即系统变量和用户变量. 但根据实际应用又被细化为四种类型,即局部变量.用户变量.会话变量和全局变量. 一.局部变量 mysql局部变量,只能用在begi ...

  4. ASP.net MVC5 Code First填充测试数据到数据库

    问题的产生  最近在看Adam Freeman的“Pro ASP.NET MVC5”,于是在工作机上面搭建了相应的运行环境,但是在自己的机器上面只有代码,没有数据库.记得在code first中可以新 ...

  5. Future 示例

    public static Object send(RequestClient request) future.channel().writeAndFlush(JSONObject.toJSONStr ...

  6. 洛谷P2820 局域网 (最小生成树)

    题目链接:https://www.luogu.org/problemnew/show/P2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内 ...

  7. StringUtils工具类常用方法汇总(判空、转换、移除、替换、反转)

    Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方法总 ...

  8. koa2 中 cookie 存在的中文问题

    koa2  中的 cookie 没办法直接设置中文,会报错 ‘ argument value is invalid ’ 解决办法: 先将它转成 ‘ base64 ’ 编码来存储 new Buffer( ...

  9. Python-图片文字识别

    百度AI接口(手写文字识别):https://ai.baidu.com/docs#/OCR-API/9ef46660 实现效果: 步骤一:接入接口 进入上述网站申请账号,然后运行相关代码,获取 acc ...

  10. oracle的存储过程的作用

    oracle的存储过程的作用 1.存储过程可以使得程序执行效率更高.安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性 ...