不乱于心,不困于情。
不畏将来,不念过往。如此,安好。

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()

赞(0) 打赏
未经允许不得转载:seo优化_前端开发_渗透技术 » Python装饰器使用方法

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏