第一步 简单函数

  1. ''' 简单的函数:调用两次'''
  2. def myfunc():
  3. print ('myfunc() called.')
  4.  
  5. myfunc()
  6. myfunc()

第二步 装饰器为调用函数提供附加功能

  1. '''替换函数(装饰)
  2. 装饰函数的参数是被装饰的函数对象,返回原函数对象
  3. 装饰的实质语句; myfunc = deco(myfunc)'''
  4. def deco(func):
  5. print ("before myfunc() called.")
  6. func()
  7. print (" after myfunc() called.")
  8. return func
  9.  
  10. def myfunc():
  11. print (" myfunc() called.")
  12.  
  13. myfunc = deco(myfunc)
  14. myfunc()
  15. myfunc()

第三步  使用语法 @ 来装饰函数

  1. '''使用语法@来装饰函数,相当于 myfunc = deco(myfun)
  2. 但新函数只在第一次被调用,且原函数多调用一次'''
  3. def deco(func):
  4. print ("before myfunc() called.")
  5. func()
  6. print (" after myfunc() called.")
  7. return func
  8.  
  9. @deco
  10. def myfunc():
  11. print (" myfunc() called.")
  12.  
  13. myfunc()
  14. myfunc()

第四步 使用内嵌包装函数来确保每次新函数都被调用

  1. '''使用内嵌包装函数来确保每次新函数都被调用,
  2. 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
  3.  
  4. def deco(func):
  5. def _deco():
  6. print ("before myfunc() called.")
  7. func()
  8. print ("after myfunc() called.")
  9. # 不需要返回func,实际上应返回原函数的返回值
  10. return _deco
  11.  
  12. @deco
  13. def myfunc():
  14. print (" myfunc() called.")
  15. return 'ok'
  16.  
  17. myfunc()

第五步  对具有参数的函数进行装饰

  1. '''对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,
  2. 装饰函数返回内嵌包装函数对象'''
  3.  
  4. def deco(func):
  5. def _deco(a, b):
  6. print ("before myfunc() called.")
  7. f = func(a, b)
  8. print ("after myfunc() called.")
  9. return f
  10. return _deco
  11.  
  12. @deco
  13. def myfunc(a, b):
  14. print (" myfunc(%s, %s) called." %(a, b))
  15. return a + b
  16.  
  17. print myfunc(1, 2)

更深入的学习会继续!

参考资料:http://blog.csdn.net/thy38/article/details/4471421

     http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html

     http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

python 装饰器初步学习的更多相关文章

  1. Python装饰器模式学习总结

    装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...

  2. python装饰器的学习笔记

    此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习. 一.什么是装饰器 1.从字面意义来看: 是用来给函数装饰打扮的函数 2.理论上可以理解为: (1).不改变函数的运行方式 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. (转载)Python装饰器学习

    转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...

  5. Python装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- ...

  6. Python 装饰器学习心得

    最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...

  7. 【转】九步学习python装饰器

    本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白 ...

  8. Python学习:11.Python装饰器讲解(二)

    回顾 上一节我们进行了Python简单装饰器的讲解,但是python的装饰器还有一部分高级的使用方式,这一节就针对python装饰器高级部分进行讲解. 为一个函数添加多个装饰器 今天,老板又交给你一个 ...

  9. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

随机推荐

  1. servlet的session为null?

    servlet的session(会话)显示为null,一般是web.xml中配置不对或者在浏览器输入的url不正确造成的. web.xml配置如下: <servlet> <servl ...

  2. Spring HTTP下载

    (1)HTTP 协议可以在客户端和服务器之间传递任何类型的文件. HTTP协议下载文档到客户端时候, 必须通过响应头Content-Type设置文件类型. 例如: contentType=text/h ...

  3. Ajax调用SpringMVC ModelAndView 无返回情况

    在项目中使用Ajax的时候,success中返回的data一直都是null,也没有报错.在确定Ajax语法没有错误,也没有牵扯跨域问题后,用排除法挨着删除代码,发现是因为Spring MVC会自动把方 ...

  4. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  5. asp.net web api添加统一异常处理

    1.自定义异常处理过滤器 /// <summary> /// 自定义异常处理过滤器 /// </summary> public class CustomExceptionFil ...

  6. @Repository、@Service、@Controller 和 @Component

    转载:http://blog.csdn.net/ye1992/article/details/19971467 spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@ ...

  7. 解决jquery-ui-autocomplete选择列表被Bootstrap模态窗遮挡的问题

    最近在一个ASP.NET MVC5项目中使用Bootstrap的模态窗(弹出层)来让用户填写内容,其中的一个编辑框提供了自动完成功能,用jQuery UI Autocomplete来实现. 因为我是W ...

  8. java基于socket公共聊天室的实现

    项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...

  9. linux bash 笔记

    Bash的简单使用笔记: 1- 命令行参数(调用脚本后面跟的参数) 2- 命令行选项(修改命令行为的单字符串) 3- 获取键盘输入 4- 读文件 5- 函数 1.命令行参数(调用脚本后面跟的参数) x ...

  10. Spark简介

    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是 ...