为何调用装饰器后仅输出原函数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,提问作者عبود عيد
相关产品推荐
相关产品推荐

