python 18 函数基础二
转自 http://www.cnblogs.com/BeginMan/p/3173328.html
一、装饰器(decorators)
装饰器的语法以@开头,接着是装饰器函数的名字、可选参数。
紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下:
@decorator(dec_opt_args)
def func(func_args):
....
其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,装饰器在函数声明完成的时候被调用,调用之后声明的函数被换成一个被装饰器装饰过后的函数。
如:

def deco(func):
...
return func @deco
def foo():
print 'foo'
#-----------------------------------
#等价如下:
def deco(func):
...
return func def foo():
print 'foo' foo = deco(foo)

如下例子:

def deco1(func):
print 'ok'
return func @deco1
def foo():
print 'foo'
foo()
#输出--------------
#ok
#foo
#------------------

如果不使用装饰器,则可如下:

def deco1(func):
print 'ok'
return func def foo():
print 'foo' print foo #<function foo at 0x00AFE6F0>
foo = deco1(foo)
foo()
#输出--------------
#ok
#foo
#------------------

两者对比下,可发现使用装饰器是那么简便、灵活。特别是在企业级的开发上。
同时也可以多个装饰器重叠使用:

def deco1(func):
print 'deco1'
return func def deco2(func):
print 'deco2'
return func
@deco1
@deco2
def foo():
print 'foo' foo() #输出如下:-----------
#deco2
#deco1
#foo
#---------------------

等效于:
@deco1
@deco2
def foo(arg):pass
-----------与下等效----------
foo = deco1(deco2(foo()))
二、有参、无参的装饰器
上面的例子基本上都是有参数的,无参数更为简单。
1、无参

@deco1
@deco2
def foo(arg):pass
---------------------
foo = deco1(deco2(foo()))

2、有参
@deco1(deco_arg)
@deco2
def foo(arg):pass
---------------------
foo = deco1(deco_arg)(deco2(foo()))
返回以函数作为参数的装饰器
三、用处
1、引用日志
2、增加计时逻辑来检测性能
3、给函数加入事务的能力
四、实例

from time import ctime,sleep def deco(func):
def decoIn():
print '[%s]:%s called' %(ctime(),func.__name__)
return func
return decoIn @deco
def foo():
pass foo()
sleep(4) for i in range(2):
sleep(1)
foo() #输出如下:--------
#[Fri Jul 05 10:45:04 2013]:foo called
#[Fri Jul 05 10:45:09 2013]:foo called
#[Fri Jul 05 10:45:10 2013]:foo called
#------------------

五、强烈推荐阅读:
http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
python 18 函数基础二的更多相关文章
- python 17 函数基础(一)
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- Less-mixin函数基础二
//mixin函数 基础使用方法 --包含选择器,example: .test(){ &:hover{ border:1px solid red; } } button{ .test; } / ...
- 【Python】函数基础简介
一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...
- PYTHON开发--面向对象基础二
一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1. 私有成员 1.1 普通方法种的私有成员 class Foo: def __init__(self, n ...
- 第十五章:Python の Web开发基础 (二) JavaScript与DOM
本課主題 JavaScript 介绍 DOM 介绍 JavaScript 介绍 JavaScript 是一门编程语言,它可以让网页动起来的,JavaScript 的变量有两种,一个是局部变量:一个是全 ...
- python中函数基础
函数 什么是函数? 函数分为内置函数和自定义函数 定义:在程序中具备某一功能的工具.在使用之前需准备该工具(函数的定义),遇到应用场景拿来就用(后引用). 为什么要用函数? 1.代码冗余 程序组织结构 ...
- python之函数基础总结
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. def sayhi(name): print("Hello, %s, I', nobo ...
- 第十章:Python の 网络编程基础(二)
本課主題 Python中的作用域补充 socketserver 源码 线程的介绍和操作实战 进程的介绍和操作实战 协程的介绍和操作实战 本周作业 Python中的作用域补充 Python世界里沒有块级 ...
- Python的函数基础
引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...
随机推荐
- django-filters,rangefilter的用法,不在某个范围内
找了好久在网上都没找到完整的示例代码,东拼西凑,连蒙带猜出来一句. not_in=django_filters.NumericRangeFilter(field_name="pid" ...
- Flink 配置文件详解
前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...
- cut 从/a/b/c/d/e获取/a/b/c
https://www.cnblogs.com/chenxiaomeng/p/10066821.html two_dir=`echo /a/b/c/d/e/f | cut -d"/" ...
- Java传输对象模式
当我们想要在客户端到服务器的一个传递具有多个属性的数据时,可使用传输对象模式.传输对象也称为值对象.传输对象是一个具有getter/setter方法的简单POJO类,并且是可序列化的,因此可以通过网络 ...
- mtk_Call setting(SS)
1.SSDS: 2.PDN type 3.server回error之后的处理通过UT接口设置SS之后,网络有时候会回error,有些运营商会根据这些error来决定是否要CSFB, CSFB的条件如下 ...
- 35-Ubuntu-组管理-01-添加组/删除组/确认组信息
组管理 提示: 创建组/删除组的终端命令都需要sudo执行,标准用户没有权限! 序号 命令 作用 01 sudo groupadd 组名 添加组 02 sudo groupdel 组名 删除组 03 ...
- 第八篇 编写spider爬取jobbole的所有文章
通过scrapy的Request和parse,我们能很容易的爬取所有列表页的文章信息. PS:parse.urljoin(response.url,post_url)的方法有个好处,如果post_ur ...
- Windows下Cython使用(VS2017)
收到公众号推送文章“利用Cython为Python代码加速”后尝试在Windows平台下使用Cython,环境为Python3.5 + VS2017. 1. 简单尝试 1)新建hello.pyx文件, ...
- 框架_mybatis2使用注解
在dao中使用注解: package cn.dao; import cn.mepu.User; import org.apache.ibatis.annotations.Select; import ...
- java oop第12章_IO、序列化和反序列化
引言:数据通常通过文件系统保存在外存中,有时需要将他们读取到程序中进行一些操作,Java针对文件系统的操作提供了一套规范,即IO,针对计算机内存而言,输入的称为输入流,输出的称为输出流. 一. ...