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
文章评论