Python高级教程:探索装饰器的魔法
在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
函数执行前后添加了一些打印语句。
高级装饰器技巧
带参数的装饰器
有时候,我们希望装饰器能够接受参数,以便更灵活地控制装饰器的行为。这可以通过嵌套函数来实现:
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之旅更加精彩。
探索Python函数的奇妙世界
« 上一篇
2024-11-03
Python面向对象编程:构建你的代码帝国
下一篇 »
2024-11-03