装饰器的介绍
(1)装饰器的本质:闭包函数
(2)装饰器的作用:在不改变原函数的调用方式情况下,给原函数增加其他功能。
(3)开发原则:开放封闭原则。
(4)语法:@+装饰器函数名
闭包
闭包函数:嵌套函数,内部函数调用外部函数的变量。
def outer(arg1):
def inner():
print(arg1)
return inner
if __name__=="__main__":
func=outer(1)
func()
装饰器
开放封闭原则:①对功能扩展是开放的②对原函数的调用方法是封闭的,即对修改是封闭的。
(1)装饰不带参数的函数
import time
def timer(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@timer
def func():
time.sleep(3)
if __name__=="__main__":
func()
(2)装饰带参数的函数。
def adder(func):
def inner(*args,**kwargs):
func(*args,**kwargs)
print("两数之和:",args[0]+args[1])
return inner
@adder
def func(arg1,arg2):
print("两数之差:",arg1-arg2)
if __name__=="__main__":
func(2, 1)
(3)带参数的装饰器
import time
FLAG=True
def outer(FLAG):
def timer(func):
def inner():
if FLAG:
start=time.time()
func()
end=time.time()
print(end-start)
else:
func()
return inner
return timer
@outer(FLAG)
def func():
time.sleep(3)
print("123")
if __name__=="__main__":
func()
(4)多个装饰器装饰一个函数
import time
def timer(func):
def inner(*args, **kwargs):
start=time.time()
func(*args, **kwargs)
end=time.time()
print(end-start)
return inner
def adder(func):
def inner(*args, **kwargs):
func(*args, **kwargs)
print("两数之和:", args[0] + args[1])
return inner
@timer
@adder
def func(arg1, arg2):
time.sleep(2)
print("两数之差:", arg1 - arg2)
if __name__ == "__main__":
func(2, 1)
(5) 特殊装饰器(wraps)
from functools import wraps
import time
def timer(func):
@wraps(func)
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner
@timer
def func():
time.sleep(3)
if __name__=="__main__":
func()