Python的装饰器类似AOP
编程思想。
假如现有函数f1
,现在有一个新需求,执行f1
要打印出现在时间
def f1():
print('hello world')
f1()
一般做法:直接在f1
函数内部直接加一行代码,这样显然是不行的,这样违反了修改是封闭的,对扩展是开放的
的原则。要是有几十上百的函数有这样一个需求,那岂不是要修改几十上百个函数的内部代码?
还有做法,定义另外一个函数,把原来的函数作为参数传递给新函数
import time
def f1():
print('hello world')
def print_current_time(func):
print(time.time())
func()
print_current_time(f1)
这样的做法调用另外一个函数来实现的,这样显然没有意义,和在f1
内部加一行代码无异。
所以:就有了装饰器
需要定义一个嵌套函数
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
def f1():
print('Hello world!')
那怎么调用定义的嵌套函数呢?
一般方法:
f = decorator(f1)
f()
这样也不是调用的原来的函数,失去了本来意义。
装饰器的真正妙用在于:
直接在原来函数上面加上
@
符号加上定义的嵌套函数。最后只需要调用原来函数就可以。
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
@decorator # 装饰器的真正妙用!
def f1():
print('Hello world!')
f1()
------------------------
输出:
1535812696.6964784
Hello world!
这样调用原来的函数,没有 改变内部代码,就能实现新功能,这就是装饰器的妙用。