You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:37:35