七个好用的装饰器("Python必备:七个高效实用的装饰器详解")

原创
ithorizon 6个月前 (10-20) 阅读数 16 #后端开发

Python必备:七个高效实用的装饰器详解

一、装饰器简介

装饰器是Python中一个非常强势且实用的功能,它允许程序员在不修改原有函数定义的情况下,增多或提升函数的行为。装饰器在很多情况下可以节约代码的可读性、可维护性和复用性。本文将介绍七个在Python开发中非常好用的装饰器。

二、七个高效实用的装饰器

1. 单例模式装饰器

单例模式装饰器可以确保一个类只有一个实例,并提供一个全局访问点。

def singleton(cls):

instances = {}

def get_instance(*args, **kwargs):

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

return get_instance

@singleton

class MyClass:

def __init__(self, value):

self.value = value

# 测试单例模式

obj1 = MyClass(1)

obj2 = MyClass(2)

print(obj1.value) # 输出:1

print(obj2.value) # 输出:1

print(obj1 is obj2) # 输出:True

2. 缓存装饰器

缓存装饰器可以将函数的于是缓存起来,以便下次调用时直接返回于是,节约效能。

from functools import lru_cache

@lru_cache(maxsize=128)

def factorial(n):

if n == 0:

return 1

else:

return n * factorial(n-1)

# 测试缓存装饰器

print(factorial(5)) # 输出:120

print(factorial(5)) # 直接从缓存返回于是,不再递归计算

3. 计时装饰器

计时装饰器可以测量函数执行的时间,方便进行性能分析。

import time

def timer(func):

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(f"{func.__name__}运行时间为:{end_time - start_time}秒")

return result

return wrapper

@timer

def my_function():

time.sleep(1)

# 测试计时装饰器

my_function()

4. 异常处理装饰器

异常处理装饰器可以自动捕获函数中的异常,并进行相应的处理。

def exception_handler(func):

def wrapper(*args, **kwargs):

try:

return func(*args, **kwargs)

except Exception as e:

print(f"异常捕获:{e}")

return None

return wrapper

@exception_handler

def divide(a, b):

return a / b

# 测试异常处理装饰器

print(divide(10, 0)) # 输出:异常捕获:division by zero

5. 日志记录装饰器

日志记录装饰器可以在函数执行前后自动记录日志信息。

import logging

logging.basicConfig(level=logging.INFO)

def log(func):

def wrapper(*args, **kwargs):

logging.info(f"起初执行{func.__name__}函数")

result = func(*args, **kwargs)

logging.info(f"{func.__name__}函数执行完成")

return result

return wrapper

@log

def my_function():

print("执行中...")

# 测试日志记录装饰器

my_function()

6. 参数校验装饰器

参数校验装饰器可以自动校验函数的输入参数,确保参数符合预期。

def validate_params(func):

def wrapper(*args, **kwargs):

if not all(isinstance(arg, int) for arg in args):

raise ValueError("所有参数必须是整数")

return func(*args, **kwargs)

return wrapper

@validate_params

def add(a, b):

return a + b

# 测试参数校验装饰器

print(add(1, 2)) # 输出:3

print(add("1", 2)) # 抛出异常:ValueError: 所有参数必须是整数

7. 节流装饰器

节流装饰器可以制约函数在一段时间内只能执行一次,防止函数极为频繁地执行。

import time

def throttle(seconds):

def decorator(func):

last_called = None

def wrapper(*args, **kwargs):

nonlocal last_called

current_time = time.time()

if last_called is None or (current_time - last_called) > seconds:

last_called = current_time

return func(*args, **kwargs)

else:

print(f"函数{func.__name__}被制约,请稍后再试")

return None

return wrapper

return decorator

@throttle(2)

def my_function():

print("执行中...")

# 测试节流装饰器

my_function() # 输出:执行中...

time.sleep(1)

my_function() # 输出:函数my_function被制约,请稍后再试

time.sleep(1)

my_function() # 输出:执行中...

三、总结

本文介绍了七个在Python开发中非常好用的装饰器,它们分别是单例模式装饰器、缓存装饰器、计时装饰器、异常处理装饰器、日志记录装饰器、参数校验装饰器和节流装饰器。掌握这些装饰器,可以让我们在编写Python代码时更加高效、简洁和灵活。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门