Python高级教程:探索装饰器的魔法

Python教程 2024-11-03 774

在Python的世界里,装饰器是一种神奇的工具,它允许我们以非侵入性的方式增强函数的功能。这篇文章将带你深入探索装饰器的高级用法,让你的代码变得更加强大和灵活。

装饰器基础

首先,让我们回顾一下装饰器的基本语法。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。下面是一个简单的示例:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

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

在这个例子中,my_decorator 是一个装饰器,它在 say_hello 函数执行前后添加了一些打印语句。

Python高级教程:探索装饰器的魔法

高级装饰器技巧

带参数的装饰器

有时候,我们希望装饰器能够接受参数,以便更灵活地控制装饰器的行为。这可以通过嵌套函数来实现:

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(3)
def greet(name):
    print(f"Hello {name}!")

greet("Alice")

类装饰器

装饰器不仅可以是函数,还可以是类。类装饰器允许你在装饰器中使用更复杂的逻辑,包括初始化和属性访问:

class Timer:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f"Starting {self.func.__name__}")
        start_time = time.time()
        result = self.func(*args, **kwargs)
        end_time = time.time()
        print(f"Finished {self.func.__name__} in {end_time - start_time} seconds")
        return result

@Timer
def long_running_task():
    time.sleep(2)
    print("Task completed.")

long_running_task()

装饰器的装饰器

装饰器可以装饰另一个装饰器,这使得代码的重用和组合变得更加强大:

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

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

@debug
@memoize
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(10))

在这个例子中,fibonacci 函数首先被 memoize 装饰,以缓存其结果,然后被 debug 装饰,以打印调用信息。

结语

装饰器是Python中一个强大的特性,它允许我们以声明式的方式增强函数。通过掌握装饰器的高级用法,你可以写出更加模块化和可重用的代码。希望这篇文章能帮助你解锁装饰器的魔法,让你的Python之旅更加精彩。

点赞387 分享 举报
探索Python函数的奇妙世界
« 上一篇 2024-11-03
Python面向对象编程:构建你的代码帝国
下一篇 » 2024-11-03

文章评论