文档章节

python的函数装饰器学习笔记

子夜闻雪
 子夜闻雪
发布于 2015/12/29 17:45
字数 576
阅读 121
收藏 6
1 基本函数

首先正常的函数形式和调用方法:

>>> def foo():
...     return 1
>>> foo()
1


2 嵌套函数

基本的嵌套函数形式和调用方法

>>> def outer():
...     x = 1
...     def inner():
...         print x # 1
...     inner() # 2
>>> outer()
1

函数inner所定义在函数outer中。inner可以访问到他的外层函数的变量。

3. 函数即对象
>>> issubclass(int, object) # all objects in Python inherit from a common baseclass
True
>>> def foo():
...     pass
>>> foo.__class__ # 1
<type 'function'>
>>> issubclass(foo.__class__, object)
True

  函数即对象,所以可以将函数当成普通的对象变量一样,可以作为普通的参数,也可以作为一个函数的返回值。

>>> def outer():
...     x = 1
...     def inner():
...         print x+1
...     return inner
... 
>>> f = outer()
>>> f()
2

    这里outer函数就是将inner函数返回给f

4 装饰函数
>>> def outer(some_func):
...     def inner():
...         print 'before some_func'
...         ret = some_func()
...         return ret + 1
...     return inner
... 
>>> def foo():
...     return 1
... 
>>> decorated = outer(foo)
>>> decorated()
before some_func
2
>>>

    这里将foo函数当作参数传递给outer函数,outer函数中定义了一个inner函数,inner中调用了传递进来的foo函数,并在调用之行之前打印文字。outer函数酱inner函数返回给decorated(这里并没有执行inner函数)。然后执行decorated()

    这里decorated通过outer函数将foo函数装饰了一下(在执行之前打印一句话)

5 使用@装饰符 
>>> def outer(some_func):
...     def inner():
...         print 'before some_func'
...         ret = some_func()
...         return ret + 1
...     return inner
... 
>>> @outer
... def foo():
...     return 1
... 
>>> foo()
before some_func
2
>>>

   这里不再明确的使用调用outer将foo当作参数传递,然后用decorated接受。而直接用@outer放在foo函数定义开头,即可实现使用outer函数装饰foo的功能。之后直接调用foo即可。

6 函数装饰传递参数
>>> def logger(func):
...     def inner(*args, **kwargs):
...         print "func start"
...         func(*args, **kwargs)
...         print "func end"
...     return inner
... 
>>> @logger
... def foo(a, b):
...     print a + b
... 
>>> foo(1, 2)
func start
3
func end
>>>

  logger中定义的inner函数用*args和**kwargs接受参数,传递给func函数执行。即完整实现一个函数装饰器的功能,之后用@logger装饰函数foo,在执行foo函数时,能看到在其之前之后打印的语句。



详细学习地址:http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/




© 著作权归作者所有

共有 人打赏支持
子夜闻雪
粉丝 3
博文 37
码字总数 16415
作品 0
海淀
程序员
python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作...

L很失败L
2015/08/20
0
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
07/22
0
0
程序员必备,快速学习 Python 的全套14张思维导图(附高清版下载)

后台回复关键词 思维导图 可获取本文中的高清思维导图(PDF版) ML & AI∣一个有用的公众号 长按,识别二维码,加关注 获取更多精彩文章

micf435p6d221ssdld2
05/23
0
0
Python装饰器AOP 不定长参数 鸭子类型 重载(三)

1 可变长参数与关键字参数 代表任意长度可变参数 代表关键字参数 用和只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被传入,则传入默认预设的值。 注意 : 须...

善良小郎君
06/17
0
0
设计模式之:理解 Python 中的装饰器

1、问题 文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出......

大数据之路
2013/07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
37分钟前
2
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
13
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部