装饰器-2

装饰器

开发原则

  • 开放封闭原则

装饰器的作用

  • 在不改变原函数的调用方式的情况下,在原函数前后增加功能

装饰器的本质

  • 闭包函数

      #定义一个装饰器
      def wrapper(f):
      	def inner(*args, **kwargs):
      		ret = f(*args, **kwargs)
      		return ret
      	return inner
      	
      @wrapper	#装饰器的使用
      def func():
      		pass
      #调用函数
      func()
    

functool.wraps

  • 内置装饰器,可以将修饰的函数各种功能还原

      from funtools import wraps
      def wrapper(func):
      	@wraps(func)
      	def inner(*args, **kwargs)
      		fet = func(*args, **kwargs)
      		return fet
      	return inner
    

带参数的装饰器

  • 需要给装饰器再外套一层

  • 个人理解:装饰器就是跳过了第一层函数,直接进入第二层函数,但是最后一层函数必须是闭包

  • 500个函数案例解决方案

      	import time
      	flag = Ture	#定义一个判断参数
      	def timer_out(flag):
      		def timer(func):
      			def inner(*args, **kwargs)
      				if flag:
      					start = time.time()
      					ret = func(*args, **kwargs)
      					end = time.time()
      					print(end - start)
      					return ret
      				else:
      					ret = func(*args, **kwargs)
      					return ret
      			return inner
      		return timer
      		
      	#timer = time_out(flag)
      	@timer_out(flag)	#给装饰器一个参数的时候,装饰器函数要再外套一层
      	def func():
      		pass
    

多个装饰器装饰一个函数

  • 多个装饰器就是装饰器的套用

  • 多个装饰器执行顺序是从下到上

  • 多个装饰器先执行距离 被装饰的函数 近的装饰器

      #定义装饰器1
      def wrapper1(f):
      	def inner1(*args, **kwargs):
      		print('wrapper1, before f')
      		ret = f(*args, **kwargs)
      		print('wrapper2, after f')
      		return ret
      	return inner1
      	
      #定义装饰器2
      def wrapper2(f):
      	def inner2(*args, **kwargs)
      		print('wrapper2, before f')
      		ret = f(*args, **kwargs)
      		print('wrapper2, after f')
      		return ret
      	return inner2
      
      #调用装饰器	
      @wrapper2	#func=wrapper(func) --> func=wrapper(warpper(func)) 调用inner2(inner1)
      @wrapper1	#func = wrapper(func) 调用inner1
      def func():
      	print('f')
      	pass
      
      #调用函数	
      func()
      #结果
      wrapper2, before f
      wrapper1, before f
      f
      wrapper1, after f
      wrapper2, after f
原文地址:https://www.cnblogs.com/liliudong/p/9572744.html