装饰器学习笔记3:简单的函数装饰器

诶嘿,终于进入正题了(⊙﹏⊙)b

  • 使用场景
     基于软件设计的开放封闭原则,必须在不对原代码修改的情况下来对代码进行功能扩展,这时就用到装饰器.

  •  本质上,装饰器其实就是一个函数,是一个多层嵌套函数,这个函数实现了一个闭包.通过装饰器可以给其他函数进行功能扩展.

 有一个简单的函数:

def say():
    print('hello')

 这时我想做个记录,记录下每次执行的时间日期,可以这么搞

import time

def say():
    now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
    with open('data','a+') as f:
        f.write('{}执行了'.format(now))
    print('hello')

 当我有多个函数都需要记录时,每一个函数进行修改比较麻烦,不但违反了封闭开放原则,而且还产生了重复代码,所以可以这样写:

import time

def log(func):
    def inner():
        now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
        with open('data','a+') as f:
            f.write('{}执行了'.format(now))
        func()
    return inner

def say():
    print('hello')

say = log(say)
say()

 这样用一个函数来包装另外一个函数.就是个简单的装饰器了.
 不过这样还是比较麻烦,每个函数都要进行一次赋值,可以用@来精简一下.

import time

def log(func):
    def inner():
        now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
        with open('data','a+') as f:
            f.write('{}执行了'.format(now))
        func()
    return inner

@log
def say():
    print('hello')

say()

 当有多个函数需要扩展时,只要每个函数def前增加@语法就可以了.这就完成了一个简单的装饰器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值