Python装饰器怎么用才能实现功能增强效果

来源:IT编程作者:三上悠亚头衔:网络博主
导读:本期聚焦于小伙伴创作的《Python装饰器怎么用才能实现功能增强效果》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Python装饰器怎么用才能实现功能增强效果》有用,将其分享出去将是对创作者最好的鼓励。

Python装饰器是一种用于修改或增强函数、类行为的设计模式,它可以在不修改原有代码的基础上,为函数或类添加额外的功能,是Python中实现功能增强的常用手段。

Python装饰器怎么用才能实现功能增强效果

装饰器的基础原理

装饰器的本质是一个接收函数作为参数,并返回一个新函数的高阶函数。Python中通过@装饰器名的语法糖可以快速使用装饰器,其底层逻辑是将被装饰的函数作为参数传入装饰器,然后用装饰器返回的新函数替换原函数。

下面是一个最简单的无参装饰器示例,实现函数调用时的日志打印功能:

import functools

def log_decorator(func):
    # 使用functools.wraps保留原函数的元信息
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"开始执行函数: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"函数 {func.__name__} 执行完成")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

# 调用被装饰的函数
print(add(1, 2))

带参数的装饰器实现

如果需要给装饰器传递参数,就需要再嵌套一层函数,外层函数接收装饰器参数,中间层函数接收被装饰的函数,最内层是实际执行的逻辑函数。

以下是一个带参数的日志装饰器,可以自定义日志前缀:

import functools

def log_decorator_with_param(prefix=""):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print(f"{prefix} 开始执行函数: {func.__name__}")
            result = func(*args, **kwargs)
            print(f"{prefix} 函数 {func.__name__} 执行完成")
            return result
        return wrapper
    return decorator

@log_decorator_with_param(prefix="[DEBUG]")
def multiply(a, b):
    return a * b

print(multiply(3, 4))

类装饰器的使用

除了函数形式的装饰器,还可以使用类实现装饰器,类装饰器需要实现__init__方法接收被装饰的函数,以及__call__方法实现调用逻辑。

下面是一个类装饰器示例,实现函数调用次数统计的功能增强:

import functools

class CallCountDecorator:
    def __init__(self, func):
        self.func = func
        self.call_count = 0
        functools.update_wrapper(self, func)

    def __call__(self, *args, **kwargs):
        self.call_count += 1
        print(f"函数 {self.func.__name__} 已被调用 {self.call_count} 次")
        return self.func(*args, **kwargs)

@CallCountDecorator
def greet(name):
    return f"Hello, {name}"

print(greet("Alice"))
print(greet("Bob"))

常见功能增强场景示例

权限校验增强

在接口函数中添加权限校验逻辑,不需要修改每个接口的内部实现:

import functools

def auth_decorator(required_role):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 模拟当前用户角色获取
            current_role = "admin"
            if current_role != required_role:
                raise PermissionError("无权限执行该操作")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@auth_decorator(required_role="admin")
def delete_user(user_id):
    return f"删除用户 {user_id} 成功"

print(delete_user(1001))

性能统计增强

为函数添加执行时间统计的功能,方便排查性能问题:

import functools
import time

def time_stat_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行耗时: {end_time - start_time:.4f} 秒")
        return result
    return wrapper

@time_stat_decorator
def heavy_compute():
    total = 0
    for i in range(1000000):
        total += i
    return total

print(heavy_compute())

使用装饰器的注意事项

  • 使用functools.wraps保留被装饰函数的元信息,避免函数名、文档字符串等属性丢失
  • 装饰器的执行时机是在模块导入时,因此不要在装饰器中写过于耗时的初始化逻辑
  • 多个装饰器装饰同一个函数时,执行顺序是从下往上,调用顺序是从上往下
  • 如果装饰器需要处理被装饰函数的参数,要使用*args**kwargs保证参数传递的通用性

Python装饰器功能增强函数包装修改时间:2026-06-15 03:09:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。