深入学习python装饰器

装饰器:用于修改其他函数功能的对象,python里一切都是对象,顾装饰器可以是函数也可以是类(单个函数接收装饰器,通过类可以实现多个功能,再通过继承可以实现增强功能)。一般用于权限验证和日志记录模块。
函数装饰器:

import time
from functools import wraps


# 计算函数的执行时间
def use_time(f):
    @wraps(f)
    def inner():
        start_time = time.time()
        print(f.__name__ + '正在要执行')
        f()
        end_time = time.time()
        print("{name}执行时间:{s}".format(name=f.__name__,s=end_time - start_time))
    return inner


# 调用装饰器
@use_time
def pt():
    time.sleep(1)
    print("我执行中")


pt()

类装饰器:

import time
from functools import wraps


class Func_Log:

    def __init__(self, filename='out.txt'):
        self.startime = time.time()
        self.endtime = None
        self.filename = filename
        self.str = None

    # 重写call函数,实现类作为装饰器的关键所在
    def __call__(self, func):
        @wraps(func)
        def use_time():
            self.str = "{name}正要执行:".format(name=func.__name__)
            self.startime = time.time()
            func()
            self.endtime = time.time()
            self.new_func()
            self.sen_mail()

        return use_time

    def new_func(self):
        print('可添加新的功能')
        with open(self.filename, 'a') as log:
            log.write(self.str + '\n')
            log.write('本次日志记录完毕')
        print('已经添加新的功能')

    def sen_mail(self):
        pass


class Func_log_pro(Func_Log):

    def __init__(self, mail, *args, **kwargs):
        self.mail = mail
        super(Func_log_pro, self).__init__(*args, **kwargs)

    def sen_mail(self):
        print("发送一封邮件,邮件地址是:{mail}".format(mail=self.mail))


# @Func_Tmie('mylog.txt')
@ Func_log_pro('wqd@163.com','mylog.txt')
def pt():
    time.sleep(1)
    print('我要打印')


if __name__ == '__main__':
    pt()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值