装饰器入门(1)

刚开始接触装饰器这个概念

在我的概念里面, 装饰器就是在函数外面再包了一层的语法糖, 可以在函数的执行前和执行后的部分添加功能,

比如 我要在函数前后,打开/关闭数据库的连接, 写入日志, 预处理等等,

这时候使用装饰器可以简化代码量,提高复用效率,

看一个简单的装饰器:

import logging
def log(func):
    def wrapper(*args, **kw):
        logging.warning("调用函数前")
        func(*args, **kw)
        logging.warning("调用函数后")
    return wrapper

@log
def now():
    print ('2017/6/26')
    return ('return result')

now()

输出:

WARNING:root:调用函数前
2017/6/26
WARNING:root:调用函数后

这个装饰器就是一个以函数为参数的函数而已。
这时候now() 就相当于 log(now)()。

这就是最简单的在函数调用前后 输出日志。
如果想要获取函数返回结果怎么办?
只需要简单地修改wrapper函数

def log(func):
    def wrapper(*args, **kw):
        logging.warning("调用函数前")
        t = func(*args, **kw)
        logging.warning("调用函数后")
        return t
    return wrapper
print(now())

输出:

2017/6/26
return result
WARNING:root:调用函数前
WARNING:root:调用函数后
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 复杂的奖金计算## 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂...
    七寸知架构阅读 9,523评论 4 67
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,337评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,440评论 11 349
  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 5,415评论 0 2
  • 我知道 思念的心 自己涂上了彩虹的颜色 如果你快乐 就分你一抹红 给你涂上热烈 如果你疲倦 就分你一抹绿 给你一分...
    爱吃菠菜的小兔子阅读 1,105评论 0 2