Python中使用函数或类去编写装饰器 及 如何给装饰器添加参数

1.什么是装饰器?

Decorator

Python中一切皆对象,函数也可以当做参数传递。

装饰器是接收函数作为参数,添加功能后返回一个新函数的函数(类),装饰器既可以通过函数去实现,也可以通过类去实现。

Python中通过 @ 使用装饰器

装饰器模式就是通过实现一个装饰器,在不修改原来函数的情况下就可以增加一些功能。

(1)使用函数编写装饰器

     编写一个记录函数耗时的装饰器

import time

# 定义一个装饰器
def log_time(func):      # 接收一个函数作为参数
    def _log(*args, **kwargs):
        beg = time.time()
        res = func(*args, **kwargs)
        print('use time: {}'.format(time.time()-beg))
        return res
    return _log

@log_time         # @只是装饰器的语法糖
def mysleep():
    time.sleep(1)
    
mysleep()

     @log_time 等价于 下面操作

newsleep = log_time(mysleep) # 传入一个mysleep返回一个新的函数
newsleep()

(2)使用类来编写装饰器

import time

class LogTime:
    def __call__(self, func):
        def _log(*args, **kwargs):
            beg = time.time()
            res = func(*args, **kwargs)
            print('use time: {}'.format(time.time()-beg))
            return res
        return _log
        
@LogTime()     # 需要加括号实现一个装饰器的实例
def mysleep():
    time.sleep(1)
    
mysleep()

        在类中使用了 __call__ 方法,那么该类创建的实例对象也将成为一个可调用对象,如:LogTime()。如果类中没有__call__方法,直接用类创建实例 LogTime() 会报错。

2.如何给装饰器增加参数?

  使用类装饰器比较方便实现装饰器参数

   什么时候需要给装饰器增加参数,例如: 想控制装饰器本身的行为时候,就会通过不同参数去控制。

import time

class LogTimeParams:
    '''通过装饰器类的__init__传参数'''
    def __init__(self, use_int=False):  # use_int使用布尔值,控制打印输出类型
        self.use_int = use_int   # 打印出来的时间是使用float值还是int值
        
    def __call__(self, func):
        def _log(*args, **kwargs):
            beg = time.time()
            res = func(*args, **kwargs)
            if self.use_int:      # True为int类型值
                print('use time: {}'.format(
                    int(time.time()-beg))
                    )
            else:                   # False为float类型值
                print('use time: {}'.format(
                    time.time()-beg)
                    )
            return res
        return _log

@LogTimeParams(True)    # 调用点给装饰器传入参数,True表示以 int类型输出
def mysleep():
    time.sleep(1)
    
mysleep()

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值