一、 什么是装饰器
Python中的装饰器就是对函数的装饰作用,对函数的执行,做了一些装饰,比方说人还是那个人,不过做了一些打扮修饰。装饰器本身也是函数,不过它可以对别的函数进行装饰,参数必须是函数。
二、装饰器遵循的原则:
1、被装饰的函数不能修改:这个大家都懂,装饰器仅仅是装饰,当然不能改变原来的函数的代码(开放封闭原则),任何函数都可以用(开放),都不必关心(内部如何实现)
2、被装饰的函数的调用方式不能改变:一样一样的,原来的函数该咋使用还得继续咋使用,不能被装饰了就变了
三、实现原理:
装饰器:高阶函数 + 函数嵌套 + 闭包
听着很高深而已
高阶函数:函数也是个对象,可以作为参数传递,还可以return返回一个函数
函数嵌套:函数里面还可以有函数
闭包:闭起来的包,就是局部变量
四、有参装饰器:(就是装饰器,也可以带参数)
import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args,**kwargs): print('%s %s():' % (text, func.__name__)) return func(*args,**kwargs) return wrapper return decorator @log('随便说点!') def say_hi(name, to): print(name + ':'+to+',h1!美女') say_hi('nulige','杨建')
执行结果:
随便说点! say_hi():
nulige:杨建,h1!美女
五、有参装饰器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige
import functools
import time
def timer(func):
"""
:param func:
:return:
"""
@functools.wraps(func)
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
return res
return wrapper
@timer
def sleep3s(name='nulige'):
print(name + '要睡着了!')
time.sleep(3)
return '不小心睡了三秒!'
sleep3s_str = sleep3s('nulige')
print(sleep3s_str)
执行结果:
nulige要睡着了! 函数[<function sleep3s at 0x02017030>],运行时间是[3.0003809928894043] 不小心睡了三秒!