一. 装饰器是什么?

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

二.装饰器语法

  (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. cocos creator怎么隐藏组件(setVisible)

    以 label 为例: this.label.node.active = fasle 隐藏节点this.label.ndoe.active = true显示节点

  2. pyCharm添加自己的快捷代码

    1.首先打开pyCharm 2.打开Settings 3.输入live点击打开 Templates 4.选中python点击"+"号 5.选择Live Template 6.以打开 ...

  3. #WEB安全基础 : HTTP协议 | 0x7 学会使用wireshark分析数据包

    wireshark是开源,免费,跨平台的抓包分析工具 我们可以通过wireshark学习HTTP报文和进行抓包分析,在CTF中的流量分析需要用到抓包 1.下载和安装 这是wireshark的官网 ht ...

  4. Vue系列之 => computed实现求值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

    Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...

  6. Hdu2039 三角形

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2039 三角形 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  7. [c/c++] programming之路(15)、多维数组和二分查找法,小外挂

    一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...

  8. JS设计模式(6)命令模式

    什么是命令模式? 定义:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化. 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录. ...

  9. element-ui checkbox传默认值的问题

    新入职一家公司了,准备把项目中遇到的问题随时记录下来.以前遇到的问题解决了没有记录,导致面试的时候问项目中遇到那些问题时,好多都忘了. 今天记录一下element-ui 的 checkbox 传递默认 ...

  10. 学习类后回顾pickle及collections模块应用场景优化

    1.首先创建一个类,并给出一个对象 class Dog(object): def __init__(self,name,kind,age): self.name=name self.kind=kind ...