5-2 装饰器面试常考问题
Posted WinvenChang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-2 装饰器面试常考问题相关的知识,希望对你有一定的参考价值。
一、什么是装饰器
Decorator
1.Python
中一切皆对象,函数也可以当做参数传递
2.装饰器是接受函数作为参数,添加功能后返回一个新函数的函数(类)
3.Python
中能过@
使用装饰器
二、编写一个记录函数耗时的装饰器
import time
def log_time(func): # 接受一个函数作为参数
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
print(use time: {}'.format(time.time()-beg))
return res
return _log
@log_time # @只是装饰器的语法糖
def mysleep():
time.sleep(1)
mysleep()
# 上面的 @log_time 也可以写成下面这样的:
newsleep = log_time(mysleep)
newsleep()
#
运行结果:
三、如何使用类编写装饰器?
import time
class LogTime:
def __call__(self, func):
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
print('use time: {}'.format(time.time()-beg))
return res
return _log
@LogTime() # 这里要加括号,用来初始化装饰器类的实例
def mysleep2):
time.sleep(1)
mysleep2()
运行结果:
四、如何给装饰器增加参数?
使用类装饰器比较方便实现装饰器参数
class LogTimeParams:
def __init__(self, use_int=False):
self.use_int = use_int
def __call__(self, func):
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
if self.use_int:
print('use time: {}'.format(int(time.time()-beg)))
else:
print('use time: {}'.format(time.time()-beg))
return res
return _log
@LogTime(True)
def mysleep3():
time.sleep(1)
mysleep3()
运行结果:
@LogTime(True)
时
@LogTime(False)
时
以上是关于5-2 装饰器面试常考问题的主要内容,如果未能解决你的问题,请参考以下文章