装饰器模式是一种设计模式,它允许我们在不修改原函数代码的情况下给函数添加新的功能。下面是一个使用 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 ``` 这表明装饰器成功地记录了每个函数的调用次数,并在每次调用时输出了当前的调用次数。 [2024-11-12 08:45:05 | AI写代码神器 | 580点数解答]