1.首先是一个很无聊的函数,实现了两个数的加法运算:

def f(x,y):
print x+y
f(2,3)

输出结果也ok

5

2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调:

def showInfo(fun):
def wrap(x,y):
print "The function before"
func(x,y)
print "The function after"
return wrap def f(x,y):
print x+y f = showInfo(f)
f(2,3)

此时的输出:

The function before
5
The function after

3.此时我们又定义了一个f1()函数也希望它和f()函数有一样的输出格式,只要在f1()执行之前调用一次showInfo()函数:

def showInfo(fun):
def wrap(x,y):
print "The function before"
func(x,y)
print "The function after"
return wrap def f1(x,y):
print x*y f1 = showInfo(f1)
f1(2,3)
The function before
6
The function after

4.此时我知道你应该大概解到了函数修饰的作用了,可是你会发现我们本义是想调用f()函数的,可是在调用的过程中使用了两次调用才得到了我们想要的效果。所以我们使用python提供的装饰器方法来修改我们的代码:

def showInfo(func):
def wrap(x,y):
print "The function before"
func(x,y)
print "The function after"
return wrap @showInfo
def f(x,y):
print x+y @showInfo
def f1(x,y):
print x*y f(2,3)
f1(2,3)

这次的结果如下,我们只需直接调用我们要用的函数就得到了我们想要的结果了:

The function before
5
The function after
The function before
6
The function after

总结:这正是python装饰器意义所在的地方。python中的可调用对象包括函数 方法 实现了__call__方法的类。python中的函数也是对象,可以作为高阶函数的参数传入或返回值返回。因此我们可以用高阶函数对某个函数进行封装,这就是python中的装饰器。他的语法结构类似这样:

@decorator
def func(func):
  pass

python学习笔记--装饰器的更多相关文章

  1. Python学习笔记--装饰器的实验

    装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...

  2. Python学习笔记: 装饰器Decorator

    介绍 装饰器是对功能函数的加强. 在原来的功能函数之外,另外定义一个装饰器函数,对原来的功能函数进行封装(wrapper)并在wrapper的过程中增加一些辅助功能. 应用场景 如下场景: 业务函数f ...

  3. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  4. python学习之装饰器-

    python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...

  5. python学习day14 装饰器(二)&模块

    装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...

  6. Python学习 :装饰器

    装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...

  7. python学习之-- 装饰器

    高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 ...

  8. 6月4日 python学习总结 装饰器复习

    1.  装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2.  装饰器的基本 ...

  9. 学习笔记——装饰器模式Decorator

    装饰器模式,最典型的例子. 工厂新开了流水线,生产了手机外壳,蓝天白云花色.刚准备出厂,客户说还要印奶牛在上面,WTF…… 时间上来不及,成本也不允许销毁了重来,怎么办?弄来一机器A,专门在蓝天白云的 ...

随机推荐

  1. python元组()小括号

    names = ('jack','rose','tom','jerry','james','jerry') print(names) print(names[0]) #使用元组中的元素 print(n ...

  2. start with...connect by子句的浅用

    start with的用法,其基本语法如下: select … from tablename start with 条件1connect by 条件2where 条件3; 但是我在pl/sql中写入以 ...

  3. scrapy的selectors

    from scrapy import Selector >>> doc = """ ... <div> ...     <ul> ...

  4. python笔记04:字典

    4.1 字典的使用 字典:通过名字来引用值的数据结构,又称为映射 字典中的值并没有特殊的顺序,但是都存储在一个特定的键下 字典提供的功能:快速查找特定键值对应关系   某些情况下,字典比列表更好用一些 ...

  5. L1-013 计算阶乘和

    对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!. 输入格式: 输入在一行中给出一个不超过10的正整数N. 输出格式: 在一行中输出S的值. 输入样例: 3 输出样例: 9   #i ...

  6. mongodb添加延时节点

    1.      简介 延时节点是主节点过去某个时间点的“数据快照”,通常用来做数据备份,如果主节点有误操作而删除了数据,可以通过延时节点来恢复数据.例如,当前时间是10:00,并且延时节点设置1个小时 ...

  7. Robolectric测试框架使用笔记

    1. 概述 Robolectric(http://robolectric.org/)是一款支持在桌面JVM模拟Android环境的测试框架,通过shadow包下的类来截取view.activity等类 ...

  8. 手动开启ARC

    手动开启某些文件的ARC,在Compiler Flags一列加上-fobjc-arc就表示开启这个.m文件的ARC 禁止某些文件的ARC,在Compiler Flags一列加上-fno-objc-ar ...

  9. jmeter随笔(34)-WebSocket协议接口测试实战

    2017年春节结束了,一切再次回归到正轨,我们飞测也开始继续分享,小怪在这里预祝大家在2017年工作顺利,满满的收获. 背景:今天研发哥们QQ我,请教websocket协议的接口测试,这哥们自己开发了 ...

  10. Eclipse Error: The refactoring does not change any source code

    最近在做android项目的过程中遇到这样一个问题,新增一个activity的时候添加不成,eclipse提示The refactoring does not change any source co ...