来源 / 菜鸟分析 编辑 / Coding学院
请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志
- import functools
- def log(text):
- if isinstance(text,str):
- def decorator(func):
- functools.wraps(func)
- def wrapper(*args,**kwargs):
- func(*args,**kwargs)
- print('%s %s' %(text,func.__name__))
- print('%s %s' %('start',func.__name__))
- return wrapper
- return decorator
- else:
- functools.wraps(func)
- def wrapper(*args,**kwargs):
- print('call %s:' %(func.__name__))
- return func(*args,**kwargs)
- return wrapper
复制代码
- >>> @log('end')
- def now():
- print('2018-01-28')
-
- start now
- >>> now()
- 2018-01-28
- end now
复制代码
其中,#@log放到now()函数的定义处,相当于执行了语句:now = log(now),而且now = log('end')(now) 装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。 在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。 decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。
|