一、函数增强类(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 rreturn 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: raiseprint(f"第{i+1}次失败,重试...")return wrapperreturn 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 nreturn 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 nreturn 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@propertydef area(self):return self.w * self.hr = Rect(10, 20)print(r.area) # 200
@staticmethod —— 静态方法
class Tool:@staticmethoddef double(n):return n * 2print(Tool.double(7)) # 14
@classmethod —— 操作类本身
class Counter:count = 0@classmethoddef increment(cls):cls.count += 1return cls.countprint(Counter.increment()) # 1print(Counter.increment()) # 2
@dataclass (3.7+)—— 自动生成 init 等
from dataclasses import dataclass@dataclassclass Person:name: strage: 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("请先登录")returnreturn 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("权限不足")returnreturn func(*a, **kw)return wrappercurrent_user = "admin"@admin_onlydef delete():print("已删除")delete()
@singleton —— 单例模式
def singleton(cls):instance = Nonedef wrapper():nonlocal instanceif instance is None:instance = cls()return instancereturn 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] = freturn freturn 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 代码!