跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 装饰器就是一个返回函数的高阶函数
未分類
4 2 月 2021

装饰器就是一个返回函数的高阶函数

装饰器就是一个返回函数的高阶函数

資深大佬 : fanqieipnet 6

装饰器就是一个返回函数的高阶函数。具体是怎么回事呢?今天番茄加速就来讲一下。

  本质上,装饰器(decorator)就是一个返回函数的高阶函数。拿到一个函数,返回一个函数,或者拿到一个类,返回另一个类。

  这是普通函数,组装后实现的效果:

   def use_logging(func):

   print(“%s is running” % func.__name__)

   return func

   def bar():

   print(‘i am bar’)

   use_logging(bar)()

  如果使用装饰器,可以这么做:

   def use_logging(func):

   print(“%s is running” % func.__name__)

   return func

   @use_logging

   def bar():

   print(‘i am bar’)

   bar()

  以上输出,都为如下:

   bar is running

   i am bar

  对比以上两种写法,可以看出,装饰器就是一个返回函数的高阶函数。python 提供了 @ 符号作为装饰器的语法糖,使我们更方便的应用装饰函数。但使用语法糖要求装饰函数必须 return 一个函数对象。

   Python 除了能支持 OOP 的 decorator 外,直接从语法层次支持 decorator 。Python 的 decorator 可以用函数实现,也可以用类实现。

   decorator 可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。下面举一个例子:设计一个 decorator,它可作用于任何函数上,并打印该函数的执行时间。

   import time

   def log(func):

   def wrapper(*args,**kw):

   t1 = time.time()

   func(*args,**kw)

   print(‘%s excute in %s ms’%(func.__name__,1000*(time.time()-t1)))

   return wrapper

   @log

   def slow(x,y,z):

   time.sleep(5)

   @log

   def fast(x,y):

   time.sleep(2)

   slow(4,5,6)

   fast(3,5)

   print(slow.__name__)

  以上写法有些缺陷,因为返回的那个 wrapper()函数名字就是’wrapper’,所以,需要把原始函数的__name__等属性复制到 wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

  不需要编写 wrapper.__name__ = func.__name__这样的代码,Python 内置的 functools.wraps 就是干这个事的,所以,一个完整的 decorator 的写法如下:

   import time,functools

   def log(func):

   @functools.wraps(func)

   def wrapper(*args,**kw):

   t1 = time.time()

   func(*args,**kw)

   print(‘%s excute in %s ms’%(func.__name__,1000*(time.time()-t1)))

   return wrapper

   @log

   def slow(x,y,z):

   time.sleep(5)

   @log

   def fast(x,y):

   time.sleep(2)

   slow(4,5,6)

   fast(3,5)

   print(slow.__name__)

  以上就是装饰器的主要用法。

大佬有話說 (0)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具