《转》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 ...
随机推荐
- 10个样式各异的CSS3 Loading加载动画
前几天我在园子里分享过2款很酷的CSS3 Loading加载动画,今天又有10个最新的Loading动画分享给大家,这些动画的样式都不一样,实现起来也并不难,你很容易把它们应用在项目中,先来看看效果图 ...
- 一篇关于apache commons类库的详解[转]
1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...
- Vue文件跳转$router传参数
<button @click = "func()">跳转</button> //js <script> export default{ meth ...
- Hadoop学习笔记——安装Hadoop
sudo mv /home/common/下载/hadoop-2.7.2.tar.gz /usr/local sudo tar -xzvf hadoop-2.7.2.tar.gz sudo mv ha ...
- thinkphp 外部js语言包
Thinkphp php文件也外部js文件公用同一个语言包 一 . php语言包转json数据格式 1.新建验证字段的语言包 application\common\lang\validate-cn.p ...
- Ubuntu中的“资源管理器”System Monitor
我们在Windows中经常要查看“资源管理器”来了解系统运行情况,对进程进行操作等等... 在Windows桌面任务栏右键“启动任务管理器”: 学习Linux,自然也希望有类似的“资源管理器”,安装完 ...
- mysql 两台主主复制配置
A.服务器 [mysqld] # The TCP/IP Port the MySQL Server will listen on port= server-id= #master-host=10.1. ...
- 对SQL语句进行过滤的函数
/// <summary> /// 过滤SQL非法字符串 /// </summary> /// <param name="value">< ...
- mysql中查看某个日期是星期几?如何知道某个日期是星期几?某个日期是周几?
需求描述: mysql中,如果要查看某个日期是星期几,可以用date_format函数实现,在此记录下. 操作过程: 1.通过date_format函数查看某个日期是星期几 mysql> sel ...
- go语言中文网中的资源
https://studygolang.com/subject/2 Go 系列教程 https://studygolang.com/subject/74 Go 语言机制 https://s ...