当前位置:首页>python>安排!Python 装饰器速查表补全了,带例子直接用

安排!Python 装饰器速查表补全了,带例子直接用

  • 2026-10-21 13:28:18
安排!Python 装饰器速查表补全了,带例子直接用
<摘要>
据粉丝要求,此前文章Python 常用装饰器 速查表,
只有装饰器名字,没有具体用法,此篇文章添加了简单例子,方便查阅,
更复杂地直接请求AI,肯定比我知道得多~~~

一、函数增强类(5 个)

@timer —— 计算函数运行时间

import timedef timer(func):    def wrapper(*args, **kwargs):        t = time.time()        r = func(*args, **kwargs)        print(f"{func.__name__} 耗时 {time.time()-t:.4f}s")        return r    return wrapper@timerdef wait():    time.sleep(1.2)wait()  # wait 耗时 1.200x s

@retry —— 自动重试

import randomdef retry(times=3):    def deco(f):        def wrapper(*a, **kw):            for i in range(times):                try: return f(*a, **kw)                except:                     if i == times-1: raise                    print(f"第{i+1}次失败,重试...")        return wrapper    return deco@retry(3)def maybe_fail():    if random.random() < 0.6: raise ValueError("失败")    print("成功")maybe_fail()

@lru_cache —— 函数结果缓存(内置)

from functools import lru_cache@lru_cache(maxsize=32)def fib(n):    if n < 2: return n    return fib(n-1) + fib(n-2)print(fib(40))  # 瞬间出结果

@cache (3.9+)—— 永久缓存

from functools import lru_cache@lru_cache(maxsize=32)def fib(n):    if n < 2: return n    return fib(n-1) + fib(n-2)print(fib(40))  # 瞬间出结果

@functools.wraps —— 保留原函数信息(写装饰器必加)

from functools import wrapsdef mydeco(f):    @wraps(f)    def wrapper(*a, **kw):        print("装饰中...")        return f(*a, **kw)    return wrapper@mydecodef hello():    "问候函数"    print("Hi")print(hello.__name__)   # hello(不是 wrapper)print(hello.__doc__)    # 问候函数

二、类 / 方法增强(4 个)

@property —— 方法变属性

class Rect:    def __init__(self, w, h):        self.w, self.h = w, h    @property    def area(self):        return self.w * self.hr = Rect(10, 20)print(r.area)  # 200

@staticmethod —— 静态方法

class Tool:    @staticmethod    def double(n):        return n * 2print(Tool.double(7))  # 14

@classmethod —— 操作类本身

class Counter:    count = 0    @classmethod    def increment(cls):        cls.count += 1        return cls.countprint(Counter.increment())  # 1print(Counter.increment())  # 2

@dataclass (3.7+)—— 自动生成 init 等

from dataclasses import dataclass@dataclassclass Person:    name: str    age: intp = Person("小明", 28)print(p)           # Person(name='小明', age=28)print(p.name)      # 小明

三、控制访问 / 架构类(3 个)

@login_required —— 登录验证(框架常用写法)

def login_required(func):    def wrapper(*a, **kw):        if not is_logged_in:  # 模拟            print("请先登录")            return        return func(*a, **kw)    return wrapperis_logged_in = True@login_requireddef see_profile():    print("个人资料")see_profile()  

@admin_only —— 管理员权限

def admin_only(func):    def wrapper(*a, **kw):        if current_user != "admin":            print("权限不足")            return        return func(*a, **kw)    return wrappercurrent_user = "admin"@admin_onlydef delete():    print("已删除")delete()

@singleton —— 单例模式

def singleton(cls):    instance = None    def wrapper():        nonlocal instance        if instance is None:            instance = cls()        return instance    return wrapper@singletonclass Logger:    def __init__(self):        print("Logger 初始化")log1 = Logger()log2 = Logger()     # 无输出print(log1 is log2) # True

四、高级进阶(3 个)

@deprecated —— 标记已废弃

import warningsdef deprecated(func):    def wrapper(*a, **kw):        warnings.warn(f"{func.__name__} 已废弃", DeprecationWarning)        return func(*a, **kw)    return wrapper@deprecateddef old_api():    return "旧接口"old_api()  # 发出 DeprecationWarning

@register —— 函数注册(插件/策略模式)

commands = {}def register(name):    def deco(f):        commands[name] = f        return f    return deco@register("add")def do_add(a, b): return a + b@register("mul")def do_mul(a, b): return a * bprint(commands["add"](5, 3))   # 8print(commands["mul"](5, 3))   # 15

@overload —— 类型提示重载(配合类型检查工具)

from typing import overload@overloaddef process(x: int) -> str: ...@overloaddef process(x: str) -> int: ...def process(x):    if isinstance(x, int):        return str(x * 10)    if isinstance(x, str):        return len(x)# mypy / IDE 会根据参数类型给出不同提示

祝你写出更简洁、更强大的 Python 代码!

往期回顾BREAK AWAY
Pandas3.0用Rust重写后性能暴增5倍?
JupyterLite 0.7发布!浏览器里的Python
Rust 悄悄成为 Python 性能加速器的真相:2025 年最新趋势剖析
2025年12月语言榜单揭秘:Python 确实强得离谱,但这 3 位才是“神仙打架”

最新文章

随机文章