老男孩python学习自修第十七天【装饰器】
装饰器:在某个方法执行前后去执行其他新定义的行为
例如:
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
def before_say_hello():
print "before hello"
def after_say_hello():
print "after hello"
def say_hello_wrapper(func):
def wrapper():
print "Before"
before_say_hello()
func()
print "After"
after_say_hello()
return wrapper
@say_hello_wrapper
def say_hello():
print "Hello!"
if __name__ == "__main__":
say_hello()
执行结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py Before before hello Hello! After after hello Process finished with exit code 0
2.装饰器的执行步骤
(1)首先,装饰器本身也是一个函数,即say_hello_wrapper也是一个函数,也需要在执行前加入到内存
(2)当执行到@say_hello_wrapper时,即将say_hello()替换为say_hello_wrapper()里面的wrapper(), 即为相同的内存地址
(3)当执行到say_hello()时,则会执行say_hello_wrapper()
注意:使用debug模式可知装饰器的执行步骤
3. 带参数函数的装饰器
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
def before_say_hello():
print "before hello"
def after_say_hello():
print "after hello"
def say_hello_wrapper(func):
def wrapper(content):
print "Before"
before_say_hello()
func(content)
print "After"
after_say_hello()
return wrapper
@say_hello_wrapper
def say_hello(content):
print "Hello, {0}".format(content)
if __name__ == "__main__":
say_hello("World")
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py Before before hello Hello, World After after hello Process finished with exit code 0
注意:只需将参数加入到wrapper()中即可,因为wrapper()为替换函数
4.带返回值函数的装饰器
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
def before_say_hello():
print "before hello"
def after_say_hello():
print "after hello"
def say_hello_wrapper(func):
def wrapper(content):
print "Before"
before_say_hello()
ret = func(content)
print "After"
after_say_hello()
return ret
return wrapper
@say_hello_wrapper
def say_hello(content):
print "Hello, {0}".format(content)
return content
if __name__ == "__main__":
ret = say_hello("World")
print ret
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day14/decorator_test.py Before before hello Hello, World After after hello World Process finished with exit code 0
老男孩python学习自修第十七天【装饰器】的更多相关文章
- 老男孩python学习自修第十八天【面向对象】
1.类与对象(构造方法与实例化) #!/usr/bin/env python # _*_ coding:UTF-8 _*_ class Province: def __init__(self, nam ...
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...
- python学习笔记-(八)装饰器、生成器&迭代器
本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...
- python学习之路 六 :装饰器
本节重点: 掌握装饰器相关知识 python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函 ...
- python学习总结---函数使用 and 装饰器
# 函数使用 ### 零碎知识 - 灵活的if-else ```python a = 3 if False else 5 print(a) ''' if False: a = 3 else: a = ...
- Python学习日记(七)——装饰器
1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print ' ...
- Python学习基础(三)——装饰器,列表生成器,斐波那契数列
装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...
- Python学习笔记(yield与装饰器)
yeild:返回一个生成器对象: 装饰器:本身是一个函数,函数目的装饰其他函数(调用其他函数) 功能:增强被装饰函数的功能 装饰器一般接受一个函数对象作为参数,以便对其增强 @原函数名 来调用其他函 ...
- 老男孩python学习自修第二十四天【多进程】
1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...
随机推荐
- geth工作运行程序转后台
今天查看了一下运行程序怎么转后台,然后就发现了之前写的脚本一定要进行console控制台然后在解锁coinbase,然后才手动挖矿的操作真的是太笨了,后面研究了一下,发现是可以在运行语句上进行操作的: ...
- Spring Boot配置文件详解-ConfigurationProperties和Value优缺点-(转)好文
文章转自 http://www.cnblogs.com/itdragon/p/8686554.html Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们 ...
- 学号 20175329 2018-2019-3《Java程序设计》第四周学习总结
学号 20175329 2018-2019-3<Java程序设计>第四周学习总结 教材学习内容总结 第五章 上周学习的第四章是体现了数据的封装,本章第五章主要是体现出对象的另外两个方面的重 ...
- centos 7 安装 MySQL 5.6
由于Centos7 默认数据库是mariabd,所以通过rpm安装MySQL需要卸载原有的Mariabd,再下载所有的依赖包比较麻烦且容易出错.通过yum的方式安装.yum其实是rpm的一个升级将所有 ...
- python五子棋
以后不更新了,把以前的一些东西发出来. 这是一个命令行环境的五子棋程序.使用了minimax算法. 除了百度各个棋型的打分方式,所有代码皆为本人所撸.本程序结构与之前的井字棋.黑白棋一模一样. 有一点 ...
- Linux下如何让jar包程序在后台一直执行
Linux下如何让Jar包程序在后台一直执行 shell命令 nohup java -jar xxx.jar & &:让程序后台执行. nohub:让程序控制台输出转移到nohub.o ...
- SpringBoot热部署的实现方式
一:热部署的实现 1.使用Spring-boot-devtools 2.使用Spring Loaded 二:devtools(推荐) 一般情况下直接在pom.xml文件添加下面的依赖即可,但eclip ...
- My ajaxwrapper tool
Until recently, when I write ajax call, always write like below: $.ajax({ type: "post", da ...
- 2018年计划小目标(9月)PMP
从6.23结束敏捷的系统贯穿学习考试,6.24开始做传统项目管理,系统学习计划,打包报考,(╥╯^╰╥):ACP+实战+PMP+软考,历时两个月 每天上下班路上3个小时,听录音,(报的远程班,倍速听了 ...
- A short Glimpse to Spectral Sequences 快速入坑谱序列(英文)
In this short paper with a few of page (but a lot of language mistake), I want to introduce the theo ...