有勇气的牛排博客

Python 装饰器模式 Decorate Patter

有勇气的牛排 31 Python 2025-07-28 22:45:50

Python 装饰器模式 Decorate Patter

1 前言

1.1 定义

如果装饰器有多个,则从下往上依次执行。

1.1.1 设计模式角度

装饰器模式是一种结构型设计模式,允许在不修改原始类代码的前提下,动态地扩展对象的功能

1.1.2 Python 角度

Python装饰器是一个接收函数/类作为参数返回一个增强后的函数/类高阶函数

1.2 优缺点

优点:

  • 不修改原函数的情况下添加功能
  • 支持灵活组合
  • 更加模块化、可重用

缺点:

  • 嵌套函数较多,初学者阅读难度稍大
  • 错误处理复杂时调试不易
  • 不当使用,可能影响函数签名和文档信息

2 基本写法

# -*- coding: utf-8 -*- def my_decorate(func): def wrapper(*args, **kwargs): print("开始执行") result = func(*args, **kwargs) print("结束执行") return result return wrapper @my_decorate def greet(name): print(f"你好:{name}") greet("有勇气的牛排") # 等价写法 # greet = my_decorate(greet) # greet("有勇气的牛排")

image.png

3 常见场景

3.1 权限校验

# -*- coding: utf-8 -*- def require_admin(func): def wrapper(user_role, user_id, *args, **kwargs): if user_role != 'admin': print('无权限') else: return func(user_role, user_id, *args, **kwargs) return wrapper @require_admin def get_user_info(user_role, user_id): print('正在获取用户信息') get_user_info("admin", 1) get_user_info("guest", 2)

3.2 耗时统计

# -*- coding: utf-8 -*- import time def func_run_time(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print("函数运行时间:%s" % (end_time - start_time)) return result return wrapper @func_run_time def test(): time.sleep(1) test()

image.png

3.3 类装饰器

类也可以作为装饰器使用,可用于更复杂的状态维护。

这里需要使用到魔法方法__call__,这个方法可以让类的调用与函数一样。

# -*- coding: utf-8 -*- class Log: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print('开始执行') result = self.func(*args, **kwargs) return result @Log def greet(name): print(f"你好:{name}") greet("有勇气的牛排")

评论区

×
×