Python实战教程:修饰器精讲!(2019下半年篇)

  

是不是很多伙伴都认为Python的语法简单,作为入门语言学起来非常简单吗?

  

很多伙伴说Python写出来的代码只要符合逻辑,不需要太多的学习即可,即可从一门其他语言跳来用Python写(当然这样是好事,谁都希望入门简单)。

  

于是我便记录一下,如果要学Python的话,到底有什么好学的。记录一下Python有什么值得学的,对比其他语言有什么特别的地方,有什么样的代码写出来更神谕的。一路回味,一路学习。

  

  

  

修饰器英文是装饰,

  

我们假设这样一种场景:古老的代码中有几个很是复杂的函数F1, F2, F3…,复杂到看都不想看,反正我们就是不想改这些函数,但是我们需要改造加功能,在这个函数的前后加功能,这个时候我们很容易就实现这个需求:

  
 def 嗨():
  ,“““hi  func,假装是很复杂的函数“““
  ,return  & # 39;你好# 39;
  def  aop(函数):
  ,“““aop  func"““
  ,打印(& # 39;before  func # 39;)
  ,打印(func ())
  ,打印(& # 39;after  func # 39;)
  ,
  if  __name__ ==, & # 39; __main__ # 39;:
  ,aop (hi) 
      Python实战教程:修饰器精讲!(2019下半年篇)      

以上是很是简单的实现,利用Python参数可以传函数引用的特性,就可以实现了这种类似AOP的效果。

  

这段代码目前没有什么问题,接下来煎鱼加需求:需求为几十个函数都加上这样的前后的功能,而所有调用这些函数地方也要相应地升级。

  

看起来这个需求比较扯,偏偏这个需求却是较为广泛:在调用函数的前后加上日志输出,在调用函数的前后计算调用时间,在调用函数的前后占用和释放资源等等。

  

一种比较笨的方法就是,为这几十个函数逐一添加一个入口函数,针对一个函数添加一个a_aop函数,针对b函数添加一个b_aop函数…如此这样。   

  
      <李>工作量大李   <李>代码变得臃肿复杂   <李>原代码有多处调用了这些函数,可以会升级不完全李
  

于是接下来有请修饰器出场,修饰器可以统一地给这些函数加这样的功能:

  <>以前def  aop(函数):   ,“““aop  func"““   ,def 包装():   ,“““wrapper  func"““   ,打印(& # 39;before  func # 39;)   ,func ()   ,打印(& # 39;after  func # 39;)   return 包装   @aop   def 嗨():   ,“““hi  func"““   ,打印(& # 39;你好# 39;)   ,   @aop   def  hello ():   ,“““hello  func"““   ,打印(& # 39;你好# 39;)   if  __name__ ==, & # 39; __main__ # 39;:   ,嗨()   之前,hello ()       Python实战教程:修饰器精讲!(2019下半年篇)      

以上aop函数就是修饰器的函数,使用该修饰器时只要在待加函数上一行加@修饰器函数名即可,如实例代码中就是@aop。

  

加上了@aop后,调用新功能的嗨函数就喝原来的调用一样:就是嗨()而不是aop(你好),也意味着所有调用这些函数的地方不需要修改就可以升级。

  

简单地来说,大概修饰器就是以上的这样子。

  

  

  

对于新手来说,上面例子中,   :为什么这样子用就可以实现需求的功能了。

  

其实我们还可以不用@,这里换一种写法:

  
 def 嗨():
  ,“““hi  func"““
  ,打印(& # 39;你好# 39;)
  def  aop(函数):
  ,“““aop  func"““
  ,def 包装():
  ,“““wrapper  func"““
  ,打印(& # 39;before  func # 39;)
  ,func ()
  ,打印(& # 39;after  func # 39;)
  return 包装
  if  __name__ ==, & # 39; __main__ # 39;:
  ,嗨()
  ,print () & # 39; & # 39;
  aop, hi =,(你好)
  ,嗨()
      Python实战教程:修饰器精讲!(2019下半年篇)      

上面的例子中的aop函数就是之前说过的修饰器函数。

  

如例子主要函数中第一次调用嗨函数时,由于嗨函数没叫修饰器,因此我们可以从输出结果中看到程序只输出了一个嗨而没有前后功能。

  

然后加了一个嗨=aop (hi)后再调用嗨函数,得到的输出结果和加修饰器的一样,换言之:

Python实战教程:修饰器精讲!(2019下半年篇)