⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Python 装饰器

Python 装饰器 · 难度:高级 · +15XP

Python 装饰器

装饰器(Decorator)是Python中一个强大的函数增强工具,可以在不修改原函数代码的前提下,为函数添加额外的功能(如日志、计时、权限检查)。装饰器本质上是一个接收函数并返回新函数的高阶函数。

基本概念

# 装饰器就是一个函数,接收函数,返回函数
def my_decorator(func):
    def wrapper():
        print("函数执行前...")
        func()
        print("函数执行后...")
    return wrapper

@my_decorator # 等价于:greet = my_decorator(greet) def greet(): print("你好,世界!")

greet() # 输出: # 函数执行前... # 你好,世界! # 函数执行后...

带参数的装饰器

import time

def timer(func): """测量函数执行时间的装饰器""" import functools @functools.wraps(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

@timer def slow_add(n): """计算1到n的累加和""" return sum(range(1, n + 1))

print(slow_add(1000000)) # 输出: # slow_add 执行耗时:0.0487秒 # 500000500000

装饰器带参数

def repeat(times):
    """重复执行函数的装饰器"""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3) # 调用3次 def say_hello(): print("Hello!") # 输出三行 Hello!

常见实用装饰器

装饰器用途
@staticmethod定义静态方法(不需要self参数)
@classmethod定义类方法(第一个参数是cls)
@property把方法变成属性访问
@functools.lru_cache缓存函数返回值(加速递归)
@dataclass自动生成类的__init__等方法

实战练习

  1. 写一个装饰器,在函数执行前后打印一条横线分隔符
  2. 写一个装饰器,把函数的返回值翻倍(只对数字类型生效)
  3. 用@timer装饰器对比for循环和列表推导式的性能
  4. 写一个装饰器限制函数调用频率(比如1秒内只能调用1次)

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 152 篇
0 完成
🔥 0