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

为何调用装饰器后仅输出原函数sayHello()的结果?

问题原因与解决办法

核心问题

你代码里的错误在于调用装饰器时,传的是sayHello()而不是sayHello:

  • sayHello()是直接执行函数,会立刻打印Hello from sayHello function,并且因为这个函数没有返回值,实际传给myDecorator的是None。
  • 装饰器myDecorator需要接收的是函数对象(也就是不带括号的sayHello),这样它才能返回包装后的嵌套函数,进而触发前置、后置的打印逻辑。

你的写法相当于只执行了原函数,装饰器拿到None后返回了nestedfunc,但你根本没调用这个返回的函数,所以Before和After完全没机会执行。

正确写法

写法一:手动传递函数对象并调用包装后的函数

def myDecorator(func):
    def nestedfunc():
        print("Before")
        func()
        print("After")
    return nestedfunc

def sayHello():
    print("Hello from sayHello function")

# 传递函数对象(不带括号),得到包装后的函数
decorated_sayHello = myDecorator(sayHello)
# 调用包装后的函数,才会触发完整逻辑
decorated_sayHello()

写法二:使用装饰器语法糖@(更常用)

def myDecorator(func):
    def nestedfunc():
        print("Before")
        func()
        print("After")
    return nestedfunc

# 用@语法糖自动将sayHello传递给myDecorator完成包装
@myDecorator
def sayHello():
    print("Hello from sayHello function")

# 直接调用sayHello,实际调用的是包装后的nestedfunc
sayHello()

两种写法执行后都会输出:

Before
Hello from sayHello function
After

内容的提问来源于stack exchange,提问作者عبود عيد

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:05:59