装饰性很强的装饰品

时间:2018-09-28 11:02:48

标签: python python-decorators

任务是使用装饰器调用一个函数4次。解决方案是:

def my_decorator (func):
    def wrapper():
        func()
        func()
        func()
        func()
    return wrapper

@my_decorator
def printer_hp():
    print('I am printer HP 4700 LaserJet')
    return 0

printer_hp()

但是,如果我将 func 移至包装函数args并在@my_decorator的括号中加上

def my_decorator ():
    def wrapper(func):
        func()
        func()
        func()
        func()
    return wrapper

@my_decorator()
def printer_hp():
    print('I am printer HP 4700 LaserJet')
    return 0

该函数自动调用4次,而无需在主程序中调用它。 为什么会这样?

1 个答案:

答案 0 :(得分:3)

因为这样做:

@my_decorator()
def printer_hp():
    ...

等效于:

printer_hp = my_decorator()(printer_hp)

由于my_decorator()返回wrapper,因此它等效于:

printer_hp = wrapper(printer_hp)

wrapper的作用是调用给定函数4次,这就是为什么printer_hp立即被调用4次的原因。

相关问题