Python装饰器中能否实现两次调用时打印不同内容?
实现两次调用输出不同内容的装饰器方案
完全可行,你只需要在装饰器的闭包中维护一个调用计数器,根据调用次数动态调整输出内容。以下是两种实现方案:
方案一:整合输出逻辑到装饰器
def decorator(func): call_count = 0 # 初始化调用计数器 def wrapper(*args, **kwargs): nonlocal call_count call_count += 1 # 根据调用次数生成前缀 prefix = "first" if call_count == 1 else "second" print(f"{prefix} call") return func(*args, **kwargs) return wrapper @decorator def notice(): pass # 原函数的输出逻辑已整合到装饰器中 notice() notice()
关键说明:
- 利用闭包特性在装饰器内部保存
call_count状态,每次调用计数器自增 - 通过
nonlocal关键字让内部函数可以修改外部的计数器变量 - 直接打印组合后的完整内容,简化原函数逻辑
方案二:保留原函数打印逻辑
如果你希望原notice函数继续保留print("call")的代码,可以修改装饰器在原输出前添加前缀:
def decorator(func): call_count = 0 def wrapper(*args, **kwargs): nonlocal call_count call_count += 1 prefix = "first" if call_count == 1 else "second" print(f"{prefix} ", end="") # 不换行,让原函数输出接在后面 return func(*args, **kwargs) return wrapper @decorator def notice(): print("call") notice() notice()
两种方案运行后都会得到期望输出:
first call second call
内容的提问来源于stack exchange,提问作者haojie
相关产品推荐
相关产品推荐

