装饰器

装饰器(decorator)

  • 装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

  • 应用场景:插入日志,性能测试,事务处理,缓存,权限校验

  • 作用:为了已经存在的函数或者对象添加额外的功能

    例子1:
    def w1(func):
    	def inner():
    		#可以加if判断
    		print("---验证---")
    		func()
    	return inner
    
    #f1=w1(f1)
    @w1
    def f1():
    	print('f1')
    
    #调用
    f1()
    

双层装饰器

  • 装饰是从下装到上,调用是从上到下。

    def w1(func):
    	print("--正在装饰1--")
    	def inner():
    		print("--正在验证1--")
    		func()
    	return inner
    
    def w2(func):
    	print("--正在装饰2--")
    	def inner():
    		print("--正在验证2--")
    		func()
    	return inner
    
    @w1
    @w2
    def f1():
    	print("--f1--")
    #装饰倒着装,调用是从上到下。
    f1()
    
    ###执行结果###
    --正在装饰2--
    --正在装饰1--
    --正在验证1--
    --正在验证2--
    --f1--
    

装饰器不定长参数

from time import ctime, sleep
def timefun(func):
	#给函数传参数
	def wrappedfunc(*args,**kw):
		print("%s called at %s"%(func.__name__, ctime()))
		func(*args,*kw)
	return wrappedfunc

@timefun
def foo(a,b,c):
	print(a+b+c)

foo(1,2,3)
foo called at Tue Jan  1 17:16:15 2019
6

装饰器return

def func(fun):
	def func_in(*args,**kwargs):
		#ret保存return 返回值,如果没有返回值为None
		ret = fun(*args,**kwargs)
		return ret
	return func_in

@func
def test(args):
	print("---%s--"%(args))
	return "haha"
print(test(1))

装饰器带参数

def func_arg(arg):
	def fun(fun):
		def func():
			print("--记录日志--%s"%(arg))
			if arg=="heihei":
				fun()
			else:
				pass
		return func
	return fun

#1.先执行func_arg函数,return 结果是这个fun函数
#等于使用@fun 对test进行装饰
@func_arg("heihei")
def test():
	print("--test--")

test()

--记录日志--heihei
--test--

类装饰器

class test(object):
	#重写这个call方法,让类加上()就可以被调用。
	def __call__(self):
			print("--test--")
t = test()
t()

--打印结果--
--test--
######

类装饰器

class Test(object):
	def __init__(self,func):
		print("---初始化--")
		print("func name is %s"%(func.__name__))
		self.__func = func

	def __call__(self):
		print("--装饰器中的功能---")
		self.__func()

@Test
def test():
	print("---test--")

test()
--打印结果--
---初始化--
func name is test
--装饰器中的功能---
---test--

原文地址:https://www.cnblogs.com/sunjingjingking/p/10203962.html