zoukankan      html  css  js  c++  java
  • python3函数的装饰器

    装饰器顾名思义就是包装,把函数包装一下我们可以做什么呢,我们可以在目标函数调用的前中后做一些事情,比如我们要统计一个函数的执行时间,

    def p():

      print('Hello World')

    要统计函数p的执行时间,最直接的是直接在函数体修改,添加时间计算逻辑:

    import time

    def p(name):

      start = time.time()

      print('Hello %s'%name)

      end = time.time()

      print('spend time is %s'%(end-start))

    如果其他函数也要统计消耗时间,那其他函数同样需要添加重复的时间计算逻辑,原本与业务无关的逻辑侵入到了业务代码里,代码重复冗余且很难扩展,公共部分难以重用,

    倘若再添加其他诸如日志统计,那么代码每次都需要重构,最简单的我们可以将公共部分抽取出一个函数:

    import time

    def show_time(func):

      start = time.time()

      func()

      end = time.time()

      print('spend time is %s'%(end-start))

    show_time(p)

    这样我们将目标函数传入到公共函数,就可以统计目标函数的执行时间了,但是目标函数需要显式调用公共函数,而且公共函数暴漏在外面,况且目标函数参数传递不灵活,

    那么我们就可以用python的装饰器了,将函数目标函数包装一下:

    import time
    def show_time(func):
    def proxy(*args,**kargs):
    start=time.time()
    print(args)
    print(kargs)
    func(args)
    end=time.time()
    print('spend %s'%(end-start))
    return proxy
    @show_time
    def test(name):
    print(name)
    time.sleep(3)
    是不是感觉有点像代理模式,这就是面向切面的编程,需要抽象一把,python函数使用装饰器可以无缝的将切面织入到业务逻辑里,这样就完成了切面的工作。
    人生苦短,我用python。
  • 相关阅读:
    [算法专题] 深度优先搜索&回溯剪枝
    [算法专题] 二分搜索&排序数组
    rand_1tom 产生 rand_1ton
    [LeetCode] Kth Largest Element in an Array
    进程控制(Note for apue and csapp)
    Transport Layer Protocols
    Internetworking
    Dynamic Programming | Set 4 (Longest Common Subsequence)
    Dynamic Programming | Set 3 (Longest Increasing Subsequence)
    Dynamic Programming | Set 2 (Optimal Substructure Property)
  • 原文地址:https://www.cnblogs.com/render-inside/p/8963055.html
Copyright © 2011-2022 走看看