python——decorator修饰器

141 阅读1分钟

修饰器用于改变已有函数的行为或表现,通过修饰器,可以在可能不改变原有代码的情况下,创建一个新的函数行为或实现新的功能。

  1. 计算
#!/usr/bin/python

def decor1(func):
    def inner():
        x = func()
        return x*x
    return inner

def decor(func):
    def inner():
        x = func()
        return 2*x
    return inner

@decor1
@decor
def num():
    return 10

print(num())

修饰器执行顺序由内向外,先调用decor修饰器,返回inner函数传递给decor1。输出400

  1. 打印
#!/usr/bin/python

def func1(func):
    def inner():
        print("i am func1")
        func()
    return inner

def func2(func):
    def inner():
        print("i am func2")
        func()
    return inner

@func1
@func2
def example():
    print("i am example")

example()

修饰器按由内到外的顺序被调用,但是每次调用并不立即执行,而是返回一个函数object给上一个decorator,执行结果:

i am func1
i am func2
i am example
  1. 装饰器不显式地接收func参数
#!/usr/bin/python3

class C1:
    def __init__(self):
        pass

    def __call__(self, func):
        def fun():
            print("i am c1")
            func()
        return fun

class C2:
    def __init__(self):
        pass

    def __call__(self, func):
        def fun():
            print("i am c2")
            func()
        return fun


class App:
    def end(self):
        return C1()
    def before(self):
        return C2()


app = App()

@app.end()
@app.before()
def test():
    print("i am test")


test()

输出:

i am c1
i am c2
i am test