微信邦

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2618|回复: 0

腾讯课堂Coding学院:浅入深谈|Python的装饰器(decorator)

[复制链接]
发表于 2018-5-17 21:29:25 | 显示全部楼层 |阅读模式
来源 / 菜鸟分析
编辑 / Coding学院

请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志

  1. import functools

  2. def log(text):
  3.         if isinstance(text,str):
  4.                 def decorator(func):
  5.                         functools.wraps(func)
  6.                         def wrapper(*args,**kwargs):
  7.                                 func(*args,**kwargs)
  8.                                 print('%s %s' %(text,func.__name__))
  9.                         print('%s %s' %('start',func.__name__))
  10.                         return wrapper
  11.                 return decorator
  12.         else:
  13.                 functools.wraps(func)
  14.                 def wrapper(*args,**kwargs):
  15.                         print('call %s:' %(func.__name__))
  16.                         return func(*args,**kwargs)
  17.                 return wrapper
复制代码

  1. >>> @log('end')
  2. def now():
  3.         print('2018-01-28')
  4.         
  5. start now
  6. >>> now()
  7. 2018-01-28
  8. end now
复制代码


其中,#@log放到now()函数的定义处,相当于执行了语句:now = log(now),而且now = log('end')(now)
装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。
在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。
decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信邦网联系QQ|Archiver|手机版|小黑屋|鲁公网安备 37082802000167号|微信邦 ( 鲁ICP备19043418号-5 )

GMT+8, 2024-9-17 04:32 , Processed in 0.076101 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Wxuse Inc. | Style by ytl QQ:1400069288

快速回复 返回顶部 返回列表