在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、迭代器和生成器理解进行解释。
为什么要使用装饰器
什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写代码的时候也要考虑到后面的可扩展性,下面我们来看一步一步的看一下python的装饰器。
一个简单例子引入无参装饰器
先来看简单的几行代码,代码的运行结果是先睡2秒,再打印"hello boy!":
import timedef foo(): """打印""" time.sleep(2) print("Hello boy!")foo()
我们现在我们需要为其添加一个程序计时功能,但是不能修改原始的代码:
import timedef timmer(func): def wrapper(): """计时功能""" time_start=time.time() func() time_end=time.time() print("Run time is %f "%(time_end-time_start)) return wrapperdef 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 timedef 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,它们的内存地址相同,所以都是指向同一个地址空间:
新闻热点
疑难解答