python装饰器

2022-03-20  本文已影响0人  JuliusL

一、python装饰器本质

一言以蔽之:函数闭包的语法糖

增强一个函数的三种方式:

1,普通增强
def 主函数():
  print("主函数逻辑")

def 增强函数(函数):
  print("增强函数开始逻辑")
  函数()
  print("增强函数结束逻辑")

def 调用():
  增强函数(主函数)
2,用闭包函数增强
def 主函数():
  print("主函数逻辑")

def 增强调用函数(函数):
  def 增强实现函数():
    print("增强函数开始逻辑")
    函数()
    print("增强函数结束逻辑")
  return 增强实现函数

def 调用():
   已增强函数 = 增强调用函数(主函数)
   已增强函数()
3、用装饰器增强
@增强调用函数
def 主函数():
  print("主函数逻辑")

def 增强调用函数(函数):
  def 增强实现函数():
    print("增强函数开始逻辑")
    函数()
    print("增强函数结束逻辑")
  return 增强实现函数

def 调用():
   主函数()

1、什么是闭包函数?

# 闭包本质上是一个函数
# 闭包函数的传入参数和返回值也都是函数
# 闭包函数的返回值函数是对传入函数进行增强后的结果
def count_time_wrapper(func):
  def improved_func():
    start_time = time.clock()
    func()
    end_time = time.clock()
  return improved_func

2、什么是语法糖?

二、 有返回值或输入参数怎么增强?

抛出两个问题

1、解决返回值问题

def 主函数():
  print("主函数逻辑")
  return 返回值

def 增强调用函数(函数):
  def 增强实现函数():
    print("增强函数开始逻辑")
    返回值 = 函数()
    print("增强函数结束逻辑")
    return 返回值
  return 增强实现函数

def 调用():
   已增强函数 = 增强调用函数(主函数)
   已增强函数()

1、解决传参问题

def 主函数():
  print("主函数逻辑")
  return 返回值

def 增强调用函数(函数):  
  def 增强实现函数(*args,**kwargs): #增强函数应把接收到所有函数传给原函数
    print("增强函数开始逻辑")
    返回值 = 函数(*args,**kwargs)
    print("增强函数结束逻辑")
    return 返回值
  return 增强实现函数

def 调用():
   已增强函数 = 增强调用函数(主函数)
   已增强函数()

三、多个装饰器的执行顺序

@wrapper1
@wrapper2
def func():
  pass

----- 执行顺序👇
wrapper1
wrapper2
func
wrapper2
wrapper1

----- 等价于👇
func = wrapper2(func)
func = wrapper1(func)

上一篇 下一篇

猜你喜欢

热点阅读