我试图理解Python装饰器并编写了这段代码:
def hello_world(fn):
print('hello world')
fn()
pass
@hello_world
def decorate():
print('hello decoatrion')
return
decorate()
我的目标是打印“你好世界”。之前'你好装饰',但输出如下:
hello world
hello decoatrion
Traceback (most recent call last):
File "test_decortor.py", line 11, in <module>
decorate()
TypeError: 'NoneType' object is not callable
答案 0 :(得分:3)
装饰者必须返回修饰函数。你可能想要这些内容:
def hello_world(fn):
def inner():
print('hello world')
fn()
return inner
@hello_world
def decorate():
print('hello decoatrion')
return
decorate()
#output: hello world
# hello decoatrion
答案 1 :(得分:3)
装饰器语法是
的简写decorated = decorate(decorated)
所以如果你有:
def hello_world(fn):
print('hello world')
fn()
pass
def decorate():
print('hello decoatrion')
return
decorate = hello_world(decorate)
你应该看看问题是什么(还要注意pass
在这里什么都不做。)
def hello_world(fn):
def says_hello():
print('hello world')
return fn()
return says_hello
def decorate():
print('hello decoration')
decorate = hello_world(decorate)
会做你想要的。或者你可以写下来:
@hello_world
def decorate():
print('hello decoration')