python decorator练习

python 3.7 练习

  1. 设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        begin = time.time()
        result = fn(*args, **kwargs)
        end = time.time()
        print('%s executed in %s ms' % (fn.__name__, (end - begin) * 1000))
    return wrapper


# 测试
@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y


@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z


f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!')
elif s != 7986:
    print('测试失败!')
  1. 编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志:
def log(x):
    def decorator(fn):
        @functools.wraps(fn)
        def wrapper(*args, **kwargs):
            print('%s %s():' % (text, fn.__name__))
            fn(*args, **kwargs)

        return wrapper
    
    if isinstance(x, str):
        text = x + ' '
        return decorator  # 若log传了str参数x,则给text赋值,并调用decorator将fn传递给decorator
    else:
        text = ''
        return decorator(x)  # 若x不是str,也就代表传递的是方法本身,则给text一个默认值,再调用decorator(x)


@log
def f():
    pass


f()
print(f.__name__)


@log('execute')
def f():
    pass


f()
print(f.__name__)

有点费脑子get✔

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,697评论 0 6
  • 文章来源 基本是拷贝的内容,目的是为了将知识点整理在一起。除了一个小结(装饰器部分)提供了我自己的解法,其余基本没...
    王诗翔阅读 710评论 0 1
  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 1,639评论 0 2
  • 回归 走了那么久,再回到原点,是不是一种倒退,一种失败。 失败是真的,因为成功只有暂时的;而倒退却未必。 回归其实...
    班加西的高格阅读 119评论 0 2
  • 近期网上兴起了一股佛系热潮,引起了众人的共鸣。佛系,是一种生活态度和方式,是一种怎么都行、不大走心、看淡一切的活法...
    南巷蔚枫阅读 685评论 0 0

友情链接更多精彩内容