本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/)

不了解装饰器的可以先看教程

直接上带参数装饰器的代码

def log(text):
def decorator(func):
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator @log('execute')
def now():
print '2013-12-25' now() 控制台输出:
execute now():
2013-12-25

这都很好理解,但是我在看到教程中的用flask框架写WEB应用时

@app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>Home</h1>'

只要在函数前面添加这样的装饰器,就能达到自动地把URL和函数给关联起来的目的

可是为什么这样写装饰器就能有这样的效果呢

我们来看了一下这个app.route这个装饰器的源码

    def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

体现这个功能的肯定是在return f前面的两行代码,它把这个映射规则添加带app对象中,细节我们不用理会

可是,这些映射规则不是应该在我们调用home函数前就应该建立起来吗?不然怎么自动映射到home这个函数。

会造成这样的困惑的原因是我一直误解的装饰器的装饰过程,其实装饰器的装饰过程是在函数定义的时候就执行了,即你在调用home之前,home早就装饰器碉堡换成装饰器返回的函数了。也就是说,就算你没调用home函数,装饰器的代码也早就执行了。

我们用代码来验证一下:

def log(text):
print 'print 1'
def decorator(func):
print 'print 2'
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator @log('NiHao')
def now():
print '2013-12-25' 控制台输出:
print 1
print 2

结果显示:我们还没调用now(),两个print语句已经执行了。

得证。

最新文章

  1. WCF学习之旅—WCF概述(四)
  2. ASP.NET SignalR
  3. SQL编码乱码解决方法
  4. HDU 1072 Nightmare
  5. PostgreSQL 在centos 7下的安装配置
  6. [转载]MySQL5.5 配置文件 my.ini 1067错误
  7. [译] 第三十天:Play Framework - Java开发者梦寐以求的框架 - 百花宫
  8. iOS 中使用Base64编码方式编码图片数据
  9. 关于Struts2的Validator的配置找不到DTD
  10. bzoj 1066 : [SCOI2007]蜥蜴 网络流
  11. CSS长度单位详解
  12. docker mac 安装并初始化GO环境
  13. EF 下如何更新数据表数据
  14. Java并发编程快速学习
  15. [转]在Windows上安装RabbitMQ
  16. 51nod 1444 破坏道路(最短路)
  17. Object equals 方法
  18. md 添加 图片
  19. luoguP4696 [CEOI2011]Matching KMP+树状数组
  20. Windows/OS X下制作Mac安装U盘

热门文章

  1. 《FLASH PROGRAMMING 那些事》总结
  2. 基于wtforms源码实现自定义form组件
  3. spark streaming基础知识1
  4. 两个java小练习
  5. [2010-12-28 20:39]ActionScript3.0中用要的公式
  6. windows下Qt5.4.2 for android开发环境配置
  7. JS与JAVA数据类型的区别
  8. RabbitMQ学习之(一)_初步了解RabbitMQ、RabbitMQ的使用流程、为什么要使用RabbitMQ、RabbitMQ的应用场景
  9. Web前端开发学习笔记(一)
  10. TCP/IP 传输原理