《转》Python学习(18)-python函数(二)
转自 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函数(二)的更多相关文章
- Python学习-18.Python中的错误处理(三)
在某些情况下,我们需要定义自己的异常并且抛出 先定义一个错误: class MyError(BaseException): def __init__(self): pass 上面定义了一个叫MyErr ...
- 《Python学习手册》(二)
<Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习杂记_11_函数(二)
函数的高级运用这部分知识的核心内容就是你要把“函数即变量”这个概念理解并运用得出神入化... 一.函数的递归调用 所谓递归调用就是函数自己调用自己,在Python中如果不做限制递归调用的死循环最多可循 ...
- 【Python学习之五】函数
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 Python不但能非常灵活地定义函数,而且本身内置 ...
- Python学习:5.函数以及基础语句
函数 一.创建函数 Python的函数的学习是Python基础的一个重要部分,函数可以重复利用,减少代码量,接下来我们就学习一下如何创建一个函数,以及函数的使用. 1.创建一个函数的基本格式 def ...
- Python学习笔记之函数
这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...
- Python 学习:常用函数整理
整理Python中常用的函数 一,把字符串形式的list转换为list 使用ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from as ...
随机推荐
- Java如何从数组中查找对象元素?
在Java中,如何从数组中查找对象元素? 示例 以下示例使用Contains方法来搜索数组中的String对象. package com.yiibai; import java.util.*; pub ...
- python_装饰器模式
装饰器模式定义:动态地给一个对象添加一些额外的职责. 在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远 ...
- Lemon OA第2篇:功能解析方法
Lemon OA,整个系统功能也算是比较丰富,OA的很多功能都能看见影子,虽然做得不是很强大 接触Lemon OA,起源于Activiti的学习热情,既然这样,研究Lemon OA的目标有3: 1.L ...
- Saltstack配置管理
制作简单初始化模块(在minion主机安装软件): 1.定义master配置文件file_roots [root@localhost~]# cat /etc/salt/master file_root ...
- 每天一个linux命令:mkdir命令
linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令 ...
- Dataguard中日志传输服务
之前,原本已经尝试过配置oracle实例的逻辑和物理standby结构,并且做个一些role交换操作,可是由于昨天学习rman的部分命令时没留意,误删掉了primary DB上的所有归档日志,因为原来 ...
- table中td的内容换行。
table设置样式: table-layout: fixed; td设置: word-wrap: break-word;
- tf.variable_scope
转载:https://blog.csdn.net/gaoyueace/article/details/79079068 例如: #在名字为ae的命名空间内创建变量 with tf.variable_s ...
- VS2010 正则批量替换头文件路径
最近在项目实践中,需要统一对工程头文件进行重构,具体要求是,将之前 #include "../../abc/def.h" 类似的头文件引用路径 替换为#include &q ...
- 【Intel AF 2.1 学习笔记三】
AF中自带一些Css矢量图标,使用时需要设置class,例如下面代码显示一个左箭头图标: <a class="icon left"></a> AF中可用的图 ...