Discuss / Python / 装饰器还是打包器?

装饰器还是打包器?

Topic source

装饰器定义:

def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper 使用: @log

def now(): pass

那么明显的装饰器就是一个接受原函数now且返回新wrapper的高级函数。 由于wrapper的return 必须是原函数的调用(不是当然可以运行,不过结果就没意思了),所以可以这样认定: 装饰器就是转移了原函数的指针,把原函数的指针指向新函数wrapper,新函数wrapper最后必须调用原函数。 类比下,去礼品店买东西(原函数),买完了,不好看,店员打包装盒,然后带走回家吃,还是得撕包装盒子。

import functools,time

def metric(text): if isinstance(text, str): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) #此处任意 return func(*args, **kw) return wrapper return decorator else: @functools.wraps(text) def wrapper(*args, **kw): print('%s():' % (text.__name__)) #此处任意 return text(*args, **kw) return wrapper

比喻的很形象 谢谢


  • 1

Reply