为什么这两个装饰器返回不同的结果?

时间:2019-08-03 06:17:22

标签: python python-3.x python-decorators

我是python decorator的新手。请帮助我。需要第一个输出。我不明白为什么第二个和第三个装饰器会两次装饰“ p”,“ i”,“ b”标签。

def AddTags(*tags):
    def decorator(oldFunc):
        def inside(*args, **kwargs):
            code = oldFunc(*args, **kwargs)
            for tag in reversed(tags):
                code = "<{0}>{1}</{0}>".format(tag, code)
            return code
        return inside
    return decorator

@AddTags("p", "i", "b")
def MyWebWelcome(name):
    return "Welcome "+name+" To my blog!"

MyWebWelcome("Drags")

# Wrong Usage
AddTags("p", "i", "b")(MyWebWelcome)("Drags")

# Wrong
def decorator(oldFunc):
    def inside(*args, **kwargs):
        code = oldFunc(*args, **kwargs)
        for tag in reversed(["p", "i", "b"]):
            code = "<{0}>{1}</{0}>".format(tag, code)
        return code
    return inside


decorator(MyWebWelcome)("Drags")

1 个答案:

答案 0 :(得分:0)

因为要使用:

AddTags("p", "i", "b")(MyWebWelcome)("Drags")

decorator(MyWebWelcome)("Drags")

MyWebWelcome功能已修饰为@AddTags("p", "i", "b")
@decorator表单应用于函数 声明 时间。
因此,第二个和第三个调用将添加另一层相同的装饰(用“ p”,“ i”,“ b”标签将字符串包装两次)