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 装饰器面试常考问题的主要内容,如果未能解决你的问题,请参考以下文章

面试常考问题:Java泛型的底层原理是什么?

5-1 面向对象基础及Python 类常考问题

面试题新

TodoPython面试题分析记录(修饰器等)

这是一道我没有解出来的面试题!!python装饰器

python3 开发面试题(装饰器必须考)6.4