当前位置:首页 > Python > 正文

掌握Python函数装饰器(从零开始学装饰器的实用指南)

Python函数装饰器的世界里,你可以轻松地为已有函数添加新功能,而无需修改其源代码。这不仅让代码更整洁、可复用,还体现了Python“优雅”与“简洁”的哲学。本教程专为编程小白设计,一步步带你理解并使用装饰器教程中的核心概念。

掌握Python函数装饰器(从零开始学装饰器的实用指南) Python函数装饰器 装饰器教程 Python装饰器入门 函数装饰器用法 第1张

什么是函数装饰器?

简单来说,Python装饰器就是一个函数,它接收另一个函数作为参数,并返回一个新的函数。这个新函数通常会在原函数执行前后添加一些额外的操作,比如日志记录、性能计时、权限验证等。

基础示例:手动实现装饰器

我们先不使用语法糖(@),而是手动实现一个简单的装饰器:

def my_decorator(func):    def wrapper():        print("函数执行前...")        func()        print("函数执行后...")    return wrapperdef say_hello():    print("Hello!")# 手动应用装饰器say_hello = my_decorator(say_hello)say_hello()

运行结果:

函数执行前...Hello!函数执行后...

使用 @ 语法糖简化写法

Python 提供了 @decorator_name 的语法糖,让装饰器的使用更加直观:

def my_decorator(func):    def wrapper():        print("【装饰器】开始执行...")        func()        print("【装饰器】执行完毕。")    return wrapper@my_decoratordef greet():    print("你好,世界!")# 直接调用greet()

带参数的函数如何装饰?

上面的例子只适用于无参函数。如果原函数有参数,我们需要让 wrapper 接收任意参数:

def log_args(func):    def wrapper(*args, **kwargs):        print(f"调用函数 {func.__name__},参数为: args={args}, kwargs={kwargs}")        result = func(*args, **kwargs)        print(f"函数 {func.__name__} 返回: {result}")        return result    return wrapper@log_argsdef add(a, b):    return a + badd(3, 5)

输出:

调用函数 add,参数为: args=(3, 5), kwargs={}函数 add 返回: 8

实战:编写一个计时装饰器

这是函数装饰器用法中非常常见的场景——测量函数执行时间:

import timedef timer(func):    def wrapper(*args, **kwargs):        start = time.time()        result = func(*args, **kwargs)        end = time.time()        print(f"{func.__name__} 耗时: {end - start:.4f} 秒")        return result    return wrapper@timerdef slow_function():    time.sleep(1)    return "完成!"slow_function()

为什么学习装饰器很重要?

掌握Python装饰器入门知识,不仅能让你写出更专业的代码,还能理解 Flask、Django 等框架中大量使用的装饰器(如 @app.route@login_required)。它是进阶 Python 开发的必备技能之一。

小结

  • 装饰器本质是一个高阶函数
  • 使用 @ 可以简化装饰器的应用
  • *args**kwargs 让装饰器兼容任意参数的函数
  • 常见用途包括:日志、计时、缓存、权限控制等

现在你已经掌握了 Python函数装饰器 的基本用法!快去尝试为你的项目添加一些实用的装饰器吧。