修饰器用于改变已有函数的行为或表现,通过修饰器,可以在可能不改变原有代码的情况下,创建一个新的函数行为或实现新的功能。
- 计算
#!/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
- 打印
#!/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
- 装饰器不显式地接收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