Python 的装饰器可谓是提高开发效率的一大利器。然而初学装饰器的时候感觉很难理解,因为除了 Python 之外没听说哪个语言有这种东西。

而且网上看的很多解释看似容易理解,但只能很快理解了装饰器能用来干嘛,看完了还是有点懵。


在我看来 Python 装饰器的本质就是:利用 Python 能够将函数作为参数、返回值,且支持函数嵌套的特性。新建一个函数作为装饰器来给已有的函数添加功能。

Talk is Cheap,直接来看代码:

def a_good_decorater(a_func):
#装饰器函数
def wrap_a_func():
print("Hit You")
a_func()
print("Hit You Again")
return wrap_a_func @a_good_decorater#此处为 Python 语法糖 可以方便地装饰函数
def pri():
print("HaHaHa, This is my first decorater") pri() >>>hit You
>>>HaHaHa, This is my first decorater
>>>hit You Again

装饰器的流程如下:

1.新建一个函数,这里称为装饰器。

2.在函数中再次建立一个函数,这里把它称为装饰函数,用来给函数添加功能。这么做的意义是能让函数经过装饰后仍然是一个函数。如果不这么做,那么就会在装饰过程中就执行函数了,还想达到期望的效果就需要在每次条用函数前都用装饰器来装饰函数,大大减少了开发效率。

3.装饰器的返回值为装饰函数。

4.将函数修改为装饰函数装饰过后的函数。

以此处代码为例,这么做完以后相当于在函数上下都加了一行 print 命令。

所以,装饰器的作用就是以同一种方式修改函数,适用于大量函数都需要添加同一功能的情况。


到这里,已经能够使用装饰器来装饰函数了。

但是,有一个问题。

由于装饰器中已经返回了装饰函数,所以相当于现有的函数已经被修改成装饰函数了,例如函数名就会是 wrap_a_func。看起来没什么问题,但是当需要用到函数属性的操作时就会出错。然而贴心的 Python 也为我们考虑到了。通过 functools.wraps 对装饰函数再次装饰,就能保留原函数的名字等。

from functools import wraps

def a_good_decorater(a_func):
@wraps(a_func)
def wrap_a_func():
print("hit You")
a_func()
print("hit You Again")
return wrap_a_func @a_good_decorater
def pri():
print("HaHaHa, This is my first decorater") pri()
print(pri.__name__) >>>hit You
>>>HaHaHa, This is my first decorater
>>>hit You Again
>>>pri

Python 之装饰器的更多相关文章

  1. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  2. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  3. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  4. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  5. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  6. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

  7. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  8. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  9. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  10. 关于python的装饰器(初解)

    在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...

随机推荐

  1. .net和JAVA面向对象,继承有趣的细节

    原型是同事间讨论的一道面试题.估计这题秒杀了不少人,LZ也被秒了. 但这个题里隐藏了一个很有趣的细节,这个细节不说清楚,不少人会其实死的冤枉. 这是C#的代码. class Program { sta ...

  2. com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '2.34435678977654336E17' in column '3' is outside valid range for the datatype INTEGER.

    ### Error querying database. Cause: java.lang.reflect.UndeclaredThrowableException### The error may ...

  3. Windows server 2008 r2下安装sqlserver2012

    在微软官网上下载sqlserver2012镜像文件:用Alcohol 120%软件进行驱动安装. 如果C盘的容量不够的话,上边的路径可以修改

  4. XML的四种解析器(dom_sax_jdom_dom4j)原理及性能比较[收藏]

    1)DOM(JAXP Crimson解析器)    DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定 ...

  5. [转]win7 64位下完美安装64位oracle 11g

    最近在网上搜如何在win764位的情况下安装64位的oracle,并且使用PLSQL Developer来管理oracle. 于是开始在oracle官网下载数据库,下载是一件很简单的事情,问题是在百度 ...

  6. 一月七笔千万美元投资!国内VR行业在刮什么风?

    虽然直到现在仍然没有一款真正能够彻底普及并改变大众操控方式的虚拟现实设备出现,但其已经被认定是未来人类社会中不可或缺的重要组成部分和工作.生活.娱乐.休闲载体.而虚拟现实设备.内容在今年年初CES展会 ...

  7. SurfaceView和TextureView的区别

    SurfaceView和TextureView均继承于android.view.View,与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能.Surfac ...

  8. 常用阻塞队列 BlockingQueue 有哪些?

    为什么要使用阻塞队列 之前,介绍了一下 ThreadPoolExecutor 的各参数的含义(并发编程之线程池ThreadPoolExecutor),其中有一个 BlockingQueue,它是一个阻 ...

  9. 深度学习遥感影像(哨兵2A/B)超分辨率

    这段时间,用到了哨兵影像,遇到了一个问题,就是哨兵影像,它的RGB/NIR波段是10米分辨率的,但是其他波段是20米和60米的,这就需要pansharpening了,所以我们需要设计一种算法来进行解决 ...

  10. 统计 Django 项目的测试覆盖率

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试.现在 ...