Python函数**装饰器**
【摘要】 深入理解Python装饰器:提升代码的灵活性Python装饰器是一个强大且灵活的工具,允许你在不修改原始函数的情况下扩展或改变其行为。它们在实际应用中广泛用于日志记录、权限验证、性能计时等场景。 一、什么是装饰器?装饰器是一个接受函数作为参数并返回一个新函数的高阶函数。装饰器常用于在函数执行前后添加功能,而不改变函数本身的代码。 1.1 基本结构def my_decorator(func)...
深入理解Python装饰器:提升代码的灵活性
Python装饰器是一个强大且灵活的工具,允许你在不修改原始函数的情况下扩展或改变其行为。它们在实际应用中广泛用于日志记录、权限验证、性能计时等场景。
一、什么是装饰器?
装饰器是一个接受函数作为参数并返回一个新函数的高阶函数。装饰器常用于在函数执行前后添加功能,而不改变函数本身的代码。
1.1 基本结构
def my_decorator(func):
def wrapper(*args, **kwargs):
# 在函数执行前添加代码
result = func(*args, **kwargs)
# 在函数执行后添加代码
return result
return wrapper
@my_decorator
def my_function():
print("The original function.")
my_function()
二、装饰器的实际应用
2.1 日志记录
通过装饰器自动记录函数的调用信息:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' with arguments {args} and {kwargs}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' returned {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(2, 3)
2.2 权限验证
在Web应用中,装饰器可以用于权限验证,确保用户有权执行某些操作:
def require_permission(permission):
def decorator(func):
def wrapper(user, *args, **kwargs):
if user.has_permission(permission):
return func(user, *args, **kwargs)
else:
raise PermissionError("Permission denied")
return wrapper
return decorator
# 示例用户类和函数
class User:
def __init__(self, permissions):
self.permissions = permissions
def has_permission(self, permission):
return permission in self.permissions
@require_permission('admin')
def delete_user(user, user_id):
print(f"User {user_id} deleted")
admin_user = User(['admin'])
delete_user(admin_user, 123)
2.3 性能计时
装饰器可以用于测量函数的执行时间,帮助识别性能瓶颈:
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds")
return result
return wrapper
@timing_decorator
def compute_square(n):
return n * n
compute_square(10000)
三、链式装饰器
多个装饰器可以叠加使用,形成链式调用。这使得代码更具模块化和可读性:
@log_decorator
@timing_decorator
def multiply(a, b):
return a * b
multiply(4, 5)
四、类装饰器
除了函数,装饰器也可以用于类,改变类的行为或添加新功能:
def add_method(cls):
cls.new_method = lambda self: "This is a new method"
return cls
@add_method
class MyClass:
pass
obj = MyClass()
print(obj.new_method()) # 输出: This is a new method
五、总结
装饰器是Python中一个强大且灵活的特性,能够帮助开发者在不改变函数代码的情况下,扩展或修改其行为。通过掌握装饰器的使用技巧,你可以编写出更具模块化、更易维护的代码。希望这篇文章能帮助你在实际应用中更好地利用装饰器。
如果你有特定的需求或想讨论的其他内容,请让我知道!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)