Python 装饰器模式:轻松记录任意函数调用次数
装饰器模式是一种设计模式,它允许我们在不修改原函数代码的情况下给函数添加新的功能。下面是一个使用 Python 实现的简单装饰器,该装饰器可以记录并打印被装饰函数的调用次数。 ```python def count_calls(func): # 使用字典来存储每个函数的调用次数 call_counts = {} def wrapper(*args, kwargs): # 每次调用时增加计数 if func in call_counts: call_counts[func] += 1 else: call_counts[func] = 1 print(f"Function {func.__name__} has been called {call_counts[func]} times.") # 调用原始函数 return func(*args, kwargs) return wrapper # 示例使用 @count_calls def say_hello(name): print(f"Hello, {name}") @count_calls def add(a, b): return a + b # 测试函数 say_hello("Alice") say_hello("Bob") result = add(3, 4) print(f"Result of add: {result}") say_hello("Charlie") ``` 解释: 1. `count_calls` 是一个装饰器函数,它接受一个函数 `func` 作为参数。 2. 在 `count_calls` 内部定义了一个嵌套函数 `wrapper`,这个函数会在每次调用时更新和打印函数的调用次数。 3. `call_counts` 是一个字典,用来存储每个被装饰函数及其对应的调用次数。这里使用函数对象本身作为键,确保即使有多个不同名称但相同功能的函数也能正确计数。 4. `wrapper` 函数内部首先检查 `func` 是否已经在 `call_counts` 中,如果在,则增加其计数;如果不在,则初始化为 1。 5. 然后 `wrapper` 打印出当前的调用次数,并调用原始函数 `func`。 6. `count_calls` 返回 `wrapper` 函数,这样当 `@count_calls` 装饰器应用于其他函数时,实际上是在替换这些函数,使其具有计数和打印功能。 运行结果: 当你运行上述代码时,控制台将显示如下输出: ``` Function say_hello has been called 1 times. Hello, Alice Function say_hello has been called 2 times. Hello, Bob Function add has been called 1 times. Result of add: 7 Function say_hello has been called 3 times. Hello, Charlie ``` 这表明装饰器成功地记录了每个函数的调用次数,并在每次调用时输出了当前的调用次数。 ######[AI写代码神器 | 580点数解答 | 2024-11-12 08:45:05]
- C 语言实现链表操作:创建、输出、删除及插入功能详解(字节豆包 | 534点数解答 | 2024-12-09 21:33:48)366
- C语言实现链表创建、输出、删除与插入操作的完整代码及注意要点(字节豆包 | 609点数解答 | 2024-12-18 12:18:21)382
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)498
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)384
- 卡牌游戏技能“教化”机制全解析:规则、代码与注意要点 (DeepSeek | 353点数解答 | 2025-07-07 15:40:28)184
- Python 模拟无名杀“教化”技能:出牌阶段规则与代码实现及优化建议(字节豆包 | 546点数解答 | 2025-07-07 15:41:02)189
- Java 实现“教化”技能:出牌阶段限两次的牌获取规则代码解析(字节豆包 | 1003点数解答 | 2025-07-07 15:41:54)156
- JavaScript 实现“教化”技能:两次出牌限制与牌型记录逻辑揭秘(字节豆包 | 846点数解答 | 2025-07-07 15:42:46)198
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)451
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)443
- Linux 开发:揭秘调用 schedule() 实现进程切换的四大常见方式! (百度文心 | 309点数解答 | 2023-11-09 18:41:19)539
- Java 硬币翻转问题:从错误代码到优化求解及开发注意要点(DeepSeek | 350点数解答 | 2025-10-24 15:10:59)100