def decorator(func):
def wrapper(func):
do something before
func()
do something later
return wrapper
func = decorator(func)---->这是我的装饰功能 func()做装饰的东西并给我输出。
为什么不简单地装饰它?
def decorator(func):
do something before
func()
do something later
decorator(func)
我能看到的唯一优势是,在一种情况下,我获得了用于分配和重用的func对象。我想这个问题有点模糊,但我想我们为什么需要返回一个函数对象,如果我们的目的只是装饰?我的意思是什么呢?
答案 0 :(得分:3)
如果你想在多个地方使用修饰函数,你有返回一个要重复使用的函数对象。
在第二个示例中,调用decorator(func)
来电func
。这意味着如果你想要装饰器行为(即“之前的东西”和“之后的东西”),你每次都要调用decorator(func)
。
装饰者的观点是你有效地做func = decorator(func)
然后,永远之后,当你调用func
时,它会自动调用装饰者的行为。
答案 1 :(得分:1)
考虑装饰器语法的含义。这样:
@decorator
def say_hi():
print "Hello!"
是这个的语法糖:
def say_hi():
print "Hello!"
say_hi = decorator(say_hi)
因此,装饰器基本上接受一个函数,并返回一个新的修改函数。换句话说,在装饰之前,say_hi
是一个功能;之后,它仍然是一个功能......虽然是经过修改的功能。
如果装饰者是这样写的:
def decorator(fn):
return "Something else"
然后,在装饰之前,say_hi
将是一个函数,但之后,它将具有值“Something else”(字符串) - 现在它不再可调用了!