zoukankan      html  css  js  c++  java
  • Python装饰器

    实例场景:

      贵公司已经上线了一款产品,但是在发布后用户使用一段时间之后,发现产品可以做一下优化,已能达到更好的用户体验,作为开发人员的你该怎么做?

    情景分析:

    1. 产品已经上线,不能轻易修改产品的代码
    2. 以最小的代价实现

    实现过程分析:

      假设我们需要在产品的某些特定的函数中增加一些日志,用以在日志中记录代码在何时进入和离开该函数……

    普通实现:

      可以在函数的开头与结尾处加上几行代码,用以记录的代码的进度:

    def func1():
        step1
        step2
        step3
    def func1():
        logger("Into func1")
        step1
        step2
        step3
        logger("Leave func1")

      分析:该种方式虽然能达到理想中的效果,但是涉及到修改了函数的源代码,一方面这样操作不安全(毕竟产品已经发布,针对代码的每一点修改都会给程序带来一定的风险),另一方面工作量比较大(假如有若干个函数都需要增加该功能……,假如增加的功能实现比较麻烦……)

    装饰器方式实现

    首先将需要新增加的功能定义为一个装饰器函数:

    import time
    
    def desc(func):
        def warpper(*args, **kwargs):
            logger("Into function %s at %s" % (func.__name__, time.time()))
            func()
            logger("Leave function %s at %s" % (func.__name__, time.time()))

      return warpper

      可以在原有功能函数之前使用“@装饰器”的方式来为函数扩展功能:

    @desc        
    def func1():
        step1
        step2
        step3

    这样就可以在执行原有函数的时候具有装饰器的功能,如以下例子:

    根据以上,我们可以看到,装饰器有以下特点:

    装饰器的本质函数,为其他函数增加附加功能。

    装饰器的原则:

    • 不能修改被装饰函数的代码。
    • 不能修改被装饰函数的调用方式。
  • 相关阅读:
    Socket和数据库的一些使用---郭雪彬
    懒加载--初步理解. by:王朋
    自定义带图片和文字的Button的排版--陈棚
    一些开源库分享 ---严焕培
    实现“手机qq”侧滑菜单 -- 吴欧
    iOS 小技巧总结
    Responder一点也不神秘————iOS用户响应者链完全剖析 周傅琦君
    通过版本号来判断用户是否是第一次登陆----By张秀清
    常用第三方推荐
    static, const 和 static const 变量的初始化问题
  • 原文地址:https://www.cnblogs.com/qianyeliange/p/8910928.html
Copyright © 2011-2022 走看看