在Python中,装饰器是一种非常强大的工具,它可以让你在代码运行时动态地修改函数或方法的行为。本文将介绍10个好用的装饰器,通过详细的代码示例,帮助零基础的朋友入门并逐渐理解装饰器的用法。

1. 简单的装饰器

首先,来看一个简单的装饰器示例:

def simple_decorator(func):
    def wrapper():
        print("Before function execution.")
        func()
        print("After function execution.")
    return wrapper

@simple_decorator
def say_hello():
    print("Hello!")

say_hello()

输出:

Before function execution.
Hello!
After function execution.

这个装饰器在执行被装饰的函数前后,输出了一些信息。

2. 带参数的装饰器

下面的装饰器可以处理带参数的函数。

def decorator_with_args(func):
    def wrapper(*args, **kwargs):
        print("Arguments received:", args, kwargs)
        return func(*args, **kwargs)
    return wrapper

@decorator_with_args
def add(a, b):
    return a + b

result = add(3, 4)
print("Result:", result)

输出:

Arguments received: (3, 4) {}
Result: 7

3. 计时装饰器

这个装饰器可以计算函数执行的时间。

import time

def time_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time:.4f} seconds")
        return result
    return wrapper

@time_decorator
def slow_function():
    time.sleep(2)
    print("Finished slow function!")

slow_function()

4. 缓存装饰器

使用这个装饰器可以缓存函数的返回值,避免重复计算。

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

@cache
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(10))  # 55

5. 权限检查装饰器

这个装饰器可以用于检查用户有没有某种权限。

def require_permission(permission):
    def decorator(func):
        def wrapper(user):
            if permission in user['permissions']:
                return func(user)
            else:
                print("Permission denied!")
                return None
        return wrapper
    return decorator

@require_permission('admin')
def delete_user(user):
    print(f"User {user['name']} deleted.")

current_user = {'name': 'Alice', 'permissions': ['read', 'write']}
delete_user(current_user)  # Permission denied!

6. 重试装饰器

这个装饰器可以在函数执行失败时进行重试。

def retry(max_retries=3):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Error: {e}. Retrying...")
            print("Max retries exceeded.")
        return wrapper
    return decorator

@retry(max_retries=3)
def unreliable_function():
    raise ValueError("Something went wrong!")

unreliable_function()

7. 日志装饰器

该装饰器可以记录函数的调用信息。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with arguments {args} and {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def multiply(x, y):
    return x * y

multiply(2, 5)

8. 只执行一次的装饰器

这个装饰器可以确保函数只执行一次。

def run_once(func):
    has_run = False
    def wrapper(*args, **kwargs):
        nonlocal has_run
        if not has_run:
            has_run = True
            return func(*args, **kwargs)
        else:
            print("Function has already been executed.")
    return wrapper

@run_once
def init():
    print("Initialization done!")

init()  # 只会打印一次
init()  # 打印 "Function has already been executed."

9. 类方法装饰器

装饰器不仅可以用于函数,也可以用于类方法。

def class_method_decorator(func):
    def wrapper(cls, *args, **kwargs):
        print(f"Calling class method {func.__name__} of {cls.__name__}")
        return func(cls, *args, **kwargs)
    return wrapper

class MyClass:
    @class_method_decorator
    def my_method(cls):
        print("Hello from class method!")

MyClass.my_method()

10. 线程安全装饰器

这个装饰器可用于保证函数在多线程环境下的安全性。

import threading

def synchronized(func):
    lock = threading.Lock()
    def wrapper(*args, **kwargs):
        with lock:
            return func(*args, **kwargs)
    return wrapper

@synchronized
def safe_function():
    print("This function is thread-safe.")

# 可以在多个线程中调用safe_function,确保它是安全的。

以上就是10个好用的Python装饰器示例。通过这些装饰器的介绍,你应该对装饰器的用法有了更深入的理解。装饰器可以广泛应用于日志记录、权限检查、性能监控等场景,加深对装饰器的理解将有助于提升你的Python编程技能。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部