没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、迭代器和生成器理解进行解释。 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写代码的时候也要考虑到后面的可扩展性,下面我们来看一步一步的看一下python的装饰器。 一个简单例子
资源推荐
资源详情
资源评论
老生常谈老生常谈Python之装饰器、迭代器和生成器之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、
迭代器和生成器理解进行解释。
为什么要使用装饰器为什么要使用装饰器
什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工
具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修
改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写代码的时候也
要考虑到后面的可扩展性,下面我们来看一步一步的看一下python的装饰器。
一个简单例子引入无参装饰器一个简单例子引入无参装饰器
先来看简单的几行代码,代码的运行结果是先睡2秒,再打印”hello boy!”:
import time
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()
我们现在我们需要为其添加一个程序计时功能,但是不能修改原始的代码:
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo=timmer(foo)
foo()
#运行结果
Hello boy!
Run time is 2.000446
看!我们没有修改原来的代码就实现了这个功能,因为函数也是对象,所以能够将函数foo当做参数传递给了函数timmer。
在python中,有个更简洁的方式来取代foo=timmer(foo),使用@timmer这种方式,这个在python中被称为语法糖。
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
@timmer #等于 foo=timmer(foo)
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()
下面我们来一步一步的分析函数的执行过程:
1.导入time模块
import time
2.定义函数timmer,定义函数并不会执行函数内的代码
def timmer(func):
3.调用装饰器,相当于foo=timer(foo),就是把函数foo作为参数穿给了函数timmer
@timmer
4.运行函数timmer,接受了参数 func=foo
def timmer(func):
5.在函数timmer内,定义了函数wrapper,wrapper函数内部代码也不执行,然后将函数wrapper作为返回值返回
return wrapper
6.将返回值赋值给了foo,在第3步中,foo=timmer(foo),还记吧
@timmer #等于 foo=timmer(foo)
7.运行函数foo(),但是这里的函数已经不是原来的那个函数了,可以打印foo,对的,因为之前我们将wrapper作为返回值传给
了foo,所以在这里执行foo就是在执行wrapper了,为了再确定这一点你也可打印wrapper,它们的内存地址相同,所以都是指
向同一个地址空间:
<function timmer.<locals>.wrapper at 0x00000180E0A8A950> #打印foo的结果
<function timmer.<locals>.wrapper at 0x000001F10AD8A950> #打印wrapper的结果
foo()
8.运行函数wrapper,记录开始时间,执行函数func,在第4步的时候,func被foo赋值,运行func就是在运行原函数foo,睡2
秒,打印字符串;
time_start=time.time()
time.sleep(2)
print("Hello boy!")
9.记录结束时间,打印运行时间,程序结束。
Hello boy!
Run time is 2.000161
有参装饰器有参装饰器
在前面的例子中,原函数没有参数,下面的来看一个当原函数有参数,该怎么修改装饰器函数呢?
import time
def timmer(func):
def wrapper(*args,**kwargs):
"""计时功能"""
start_time=time.time()
res=func(*args,**kwargs)
end_time=time.time()
print("Run time is %f"%(end_time-start_time))
return res
return wrapper
@timmer
def my_max(x,y):
"""返回两个值的最大值"""
res=x if x > y else y
time.sleep(2)
return res
res=my_max(1,2)
print(res)
#运行结果
Run time is 2.000175
当原函数有需要传入参数的时候,在这个例子my_max有两个位置形成需要传入参数,只需要在wrapper上添加两个形参,本
例子中使用了可变参数(*args,**kwargs)也是可以的,这是@timmer就等于my_max(1,2)=timmer(my_max)
下面我们来看一个带有参数的装饰器:带有参数的装饰器:
def auth(filetype):
def auth2(func):
剩余7页未读,继续阅读
资源评论
weixin_38504417
- 粉丝: 5
- 资源: 937
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功