1.Python中,一切皆对象,一个函数也可当做一个对象传递,
2.装饰器就是接受一个函数作为参数,添加功能后返回一个新函数的函数或类。
3.python 中使用 @ 来使用装饰器。
4.@ 只是装饰器的语法糖,语法糖(Syntactic sugar),也译为糖衣语法,是一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
使用装饰器写一个延时函数(装饰器功能:计算函数运行时间)
# _*_ coding:utf-8 _*_
import time
def log_time(func): # 接受一个函数作为参数
def _log(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
print('use time:{}'.format(time.time() - start_time))
return res
return _log
@log_time # 使用装饰器
def my_sleep():
time.sleep(2)
my_sleep()
""" @log_time 等价于:
log_time(my_sleep())
"""
使用类写一个带参数的装饰器
class MyLog(object):
def __init__(self, on_off='on'): # 定义默认参数
self.on_off = on_off
def __call__(self, func):
def _log(*args, **kwargs):
if self.on_off == 'on':
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print('|运行时长:{:.4f}'.format(end - start))
return res
elif self.on_off == 'off':
pass
else:
print('log:on_off传参不对')
return _log
# 测试装饰器
class Test():
@MyLog()
def test(self):
time.sleep(1)
Test().test()