欢迎访问宙启技术站
智能推送

Python中使用Decorators函数的10个例子

发布时间:2023-07-06 07:35:31

装饰器是Python中一个强大而有趣的概念。它们允许在不修改已有代码的情况下修改函数的行为。装饰器函数接受一个函数作为输入,并返回一个修改后的函数。在这篇文章中,我将给出10个使用装饰器的实际例子。

1. 计时器

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

这个装饰器能够测量函数的运行时间,并打印出来。它接受一个函数作为输入,创建一个新的闭包函数并返回。

2. 缓存

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

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

print(fibonacci(10))

这个装饰器用于缓存函数的结果。如果函数被调用了多次,那么结果将被缓存起来,避免重复计算。

3. 输入验证

def validate_input(func):
    def wrapper(*args):
        for arg in args:
            if not isinstance(arg, int):
                raise ValueError("输入必须为整数")
        return func(*args)
    return wrapper

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

print(add(2, 3))
print(add("2", 3))

这个装饰器用于验证函数的输入是否满足条件。在这个例子中,它验证输入是否是整数类型。

4. 输出转换

def to_upper(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

@to_upper
def greet(name):
    return f"Hello, {name}!"

print(greet("John"))

这个装饰器用于将函数的输出转换成大写。

5. 权限验证

def login_required(func):
    def wrapper(*args, **kwargs):
        if not is_logged_in():
            raise PermissionError("请先登录")
        return func(*args, **kwargs)
    return wrapper

@login_required
def secret_page():
    return "秘密页面"

print(secret_page())

这个装饰器用于验证用户是否登录,如果没有登录,则抛出权限错误。

6. 日志记录

def log(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        with open("log.txt", "a") as f:
            f.write(f"函数 {func.__name__} 被调用
")
        return result
    return wrapper

@log
def do_something():
    return "完成"

print(do_something())

这个装饰器用于记录函数的调用次数和调用时间。在这个例子中,log.txt 文件将被打开并且添加一行日志。

7. 压缩

import zlib

def compress(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return zlib.compress(result.encode())
    return wrapper

@compress
def get_data():
    return "这是一段数据"

data = get_data()
print(data)
print(zlib.decompress(data).decode())

这个装饰器用于对函数的输出进行压缩。在这个例子中,它使用 zlib 库对字符串进行了压缩和解压缩。

8. 路由

routes = {}

def route(path):
    def decorator(func):
        routes[path] = func
        return func
    return decorator

@route("/")
def home():
    return "首页"

@route("/about")
def about():
    return "关于我们"

print(routes)

print(routes["/"]())
print(routes["/about"]())

这个装饰器用于创建基于路径的路由。在这个例子中,它使用字典来存储路由映射,每个路径对应一个函数。

9. 归一化

def normalize(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.lower().strip()
    return wrapper

@normalize
def get_name():
    return "    John Doe   "

print(get_name())

这个装饰器用于将函数的输出转换成小写,并去除多余的空格。

10. 重试

import random

def retry(max_attempts):
    def decorator(func):
        def wrapper(*args, **kwargs):
            attempts = 0
            while attempts < max_attempts:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"重试 ({attempts+1}/{max_attempts})...")
                    attempts += 1
                    time.sleep(1)
            raise Exception("重试失败")
        return wrapper
    return decorator

@retry(3)
def connect_to_server():
    if random.randint(0, 5) < 4:
        raise ConnectionError("连接失败")
    return "连接成功"

print(connect_to_server())

这个装饰器用于在函数失败时重试指定次数。在这个例子中,如果连接失败,它将重试3次。(当然可以自定义重试的次数)

这些例子涵盖了装饰器的一些常见用法,从简单的计时器到复杂的重试机制。装饰器是Python中一种强大的工具,可以帮助你更加清晰和高效地编写代码。希望这篇文章对你有所帮助!