Python函数**装饰器**

举报
i-WIFI 发表于 2025/02/28 19:58:03 2025/02/28
32 0 0
【摘要】 深入理解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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。