10个Python经典装饰器

844 篇文章 0 订阅
56 篇文章 0 订阅

Python中的装饰器是一种非常强大的功能,它允许用户在不修改原有函数定义的情况下,给函数添加额外的功能。这里列出10个经典的或有代表性的装饰器示例,帮助你理解装饰器的多样性和强大之处:

1. 计时装饰器

  • 这个装饰器可以用来测量函数执行时间。

import time

def timing_decorator(func):
def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} took {end - start} seconds to execute")
return result
return wrapper

@timing_decorator
def example_function():
    time.sleep(1)

example_function()

2. 日志记录装饰器

  • 用于在函数调用前后打印日志信息。

def logging_decorator(func):
def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} finished executing.")
return result
return wrapper

@logging_decorator
def another_example():
pass

another_example()

3. 缓存装饰器(Memoization)

  • 用于缓存具有重复计算的函数结果,提高效率。

def memoize(func):
    cache = {}
def wrapper(*args):
if args not in cache:
            cache[args] = func(*args)
return cache[args]
return wrapper

@memoize
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

4. 权限检查装饰器

  • 用于验证用户是否有权限执行某个操作。

def admin_required(func):
def wrapper(user, *args, **kwargs):
if user.is_admin:
return func(user, *args, **kwargs)
else:
raise PermissionError("Admin access required.")
return wrapper

@admin_required
def sensitive_operation(user):
    print(f"{user.name} performed a sensitive operation.")

# 假设User类有一个is_admin属性
class User:
def __init__(self, name, is_admin=False):
        self.name = name
        self.is_admin = is_admin

user = User("Alice", True)
sensitive_operation(user)

5. 单例模式装饰器

  • 确保一个类只有一个实例,并提供一个全局访问点。

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 SingletonClass:
pass

s1 = SingletonClass()
s2 = SingletonClass()
assert s1 is s2

6. 异常处理装饰器

  • 自动处理函数中抛出的特定异常。

def exception_handler(exception_type, handler):
def decorator(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except exception_type as e:
return handler(e)
return wrapper
return decorator

@exception_handler(ValueError, lambda e: f"Caught an error: {e}")
def might_raise_value_error(x):
return 1 / x

print(might_raise_value_error(0))

7. 性能分析装饰器

  • 使用cProfile模块进行性能分析。

import cProfile

def profile_decorator(func):
def wrapper(*args, **kwargs):
        profiler = cProfile.Profile()
        profiler.enable()
        result = func(*args, **kwargs)
        profiler.disable()
        profiler.print_stats()
return result
return wrapper

@profile_decorator
def some_function_to_profile():
# 示例代码
pass

some_function_to_profile()

8. 类方法/静态方法装饰器

  • 将普通方法转换为类方法或静态方法。

def classmethod_decorator(func):
def wrapper(cls, *args, **kwargs):
return func(*args, **kwargs)
return classmethod(wrapper)

def staticmethod_decorator(func):
return staticmethod(func)

class MyClass:
    @classmethod_decorator
def from_string(cls, string):
return cls(string)

    @staticmethod_decorator
def multiply(a, b):
return a * b

instance = MyClass.from_string("Hello")
print(MyClass.multiply(2, 3))

9. 重试装饰器

  • 当函数执行失败时自动重试一定次数。

import random

def retry(max_retries=3, delay=1):
def decorator(func):
def wrapper(*args, **kwargs):
            retries = 0
while retries < max_retries:
try:
return func(*args, **kwargs)
except Exception as e:
                    retries += 1
                    print(f"Retrying {func.__name__} due to {e}. Attempt {retries}/{max_retries}.")
                    time.sleep(delay)
raise Exception(f"Failed after {max_retries} attempts.")
return wrapper
return decorator

@retry(max_retries=3)
def flaky_function():
if random.random() > 0.5:
raise ValueError("Random failure.")
return "Success!"

print(flaky_function())

10. 类装饰器

  • 用于修改或包装类的行为。

def add_extra_attribute(cls):
    cls.extra_attribute = "This is an extra attribute."
return cls

@add_extra_attribute
class MyClass:
pass

instance = MyClass()
print(instance.extra_attribute)

这些示例展示了装饰器在不同场景下的应用,从性能优化、错误处理到设计模式的应用,体现了装饰器的强大灵活性和实用性。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值