当前位置:实例文章 » 其他实例» [文章]Python 闭包 & 装饰器

Python 闭包 & 装饰器

发布人:shili8 发布时间:2025-01-30 04:17 阅读次数:0

**Python闭包与装饰器**

在 Python 中,闭包(Closure)和装饰器(Decorator)是两个非常重要的概念,它们可以帮助我们编写更高效、更易维护的代码。

###1.闭包闭包是一种特殊的函数,它可以访问外部作用域中的变量,并在内部作用域中使用这些变量。闭包通常用于实现回调函数或高阶函数。

**示例:**

def outer(x):
 def inner(y):
 return x + y return innerf = outer(5)
print(f(3)) # 输出:8


在这个例子中,`outer` 函数返回了一个闭包 `inner`。`inner` 函数可以访问外部作用域中的变量 `x`,并使用它来计算结果。

###2. 装饰器装饰器是一种特殊的函数,它可以修改或扩展另一个函数的行为。装饰器通常用于实现日志记录、缓存、认证等功能。

**示例:**

def decorator(func):
 def wrapper(*args, **kwargs):
 print("Before calling the function")
 result = func(*args, **kwargs)
 print("After calling the function")
 return result return wrapper@decoratordef add(a, b):
 return a + bprint(add(3,4)) # 输出: Before calling the function, After calling the function,7


在这个例子中,`decorator` 函数返回了一个装饰器 `wrapper`。`wrapper` 函数可以修改或扩展 `add` 函数的行为。

###3. 装饰器的应用装饰器有很多应用场景,例如:

* **日志记录**:使用装饰器来记录函数的执行时间、参数和返回值。
* **缓存**:使用装饰器来缓存函数的结果,以减少重复计算。
* **认证**:使用装饰器来检查函数的调用者是否具有合法权限。

###4. 使用装饰器实现日志记录
import loggingfrom functools import wrapslogging.basicConfig(level=logging.INFO)

def log(func):
 @wraps(func)
 def wrapper(*args, **kwargs):
 try:
 result = func(*args, **kwargs)
 logging.info(f"Function {func.__name__} executed successfully")
 return result except Exception as e:
 logging.error(f"Error occurred in function {func.__name__}: {str(e)}")
 return wrapper@logdef add(a, b):
 return a + bprint(add(3,4))


在这个例子中,`log` 函数是一个装饰器,它可以记录函数的执行结果和错误信息。

###5. 使用装饰器实现缓存
from functools import wrapsdef cache(func):
 cache_dict = {}
 @wraps(func)
 def wrapper(*args, **kwargs):
 key = str(args) + str(kwargs)
 if key in cache_dict:
 return cache_dict[key]
 else:
 result = func(*args, **kwargs)
 cache_dict[key] = result return result return wrapper@cachedef fibonacci(n):
 if n <=1:
 return n else:
 return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))


在这个例子中,`cache` 函数是一个装饰器,它可以缓存函数的结果,以减少重复计算。

###6. 使用装饰器实现认证
from functools import wrapsdef authenticate(func):
 @wraps(func)
 def wrapper(*args, **kwargs):
 if kwargs.get("username") == "admin" and kwargs.get("password") == "123456":
 return func(*args, **kwargs)
 else:
 raise Exception("Authentication failed")
 return wrapper@authenticatedef get_data(username, password):
 return {"data": "Hello, world!"}

try:
 print(get_data(username="admin", password="123456"))
except Exception as e:
 print(str(e))


在这个例子中,`authenticate` 函数是一个装饰器,它可以检查函数的调用者是否具有合法权限。

###7. 总结闭包和装饰器是 Python 中非常重要的概念,它们可以帮助我们编写更高效、更易维护的代码。通过使用闭包和装饰器,我们可以实现回调函数、缓存、认证等功能,提高代码的可读性和可维护性。

###8. 参考* [Python闭包]( />* [Python 装饰器]( />* [Python functools.wraps()](

相关标签:python开发语言
其他信息

其他资源

Top