在学习装饰器前需要学习闭包的概念,可参考文章: python中闭包和nonlocal声明.
装饰器就是闭包的一种延申,比闭包更加简洁方便。
#使用闭包调用
def write(func): #闭包
def inner():
print("write a number")
func()
return inner
def f1():
print("I write a 1")
def f2():
print("I write a 2")
f = write(f1)
f()
>>>
write a number
I write a 1
如果使用装饰器则会简单很多
def write(func): #闭包
def inner():
print("write a number")
func()
return inner
@write #执行的是闭包调用里的:f = write(f1)
def f1():
print("I write a 1")
def f2():
print("I write a 2")
f1() #可以直接使用f1()来达到闭包的效果
>>>
write a number
I write a 1
正如例子中的注解所说, @write 就是代替了闭包调用的一步,使代码更加简洁。
重叠装饰器就是在被装饰的函数前有两个装饰器,先运行的是离函数最近的那个装饰器,但是闭包中的内部函数运行的顺序正好相反。
def write_1(func): #闭包
print("runing write_1")
def inner():
print("write a number,write_1")
func()
return inner
def write_2(func): #闭包
print("runing write_2")
def inner():
print("write a number,write_2")
func()
return inner
@write_2
@write_1
def f1():
print("I write a 1")
>>>
runing write_1
runing write_2
write a number,write_2 #注意顺序
write a number,write_1
I write a 1
I write a 2
参数化装饰器的意思是:在函数有参数时,闭包中的函数也应该有参数。并且必要时使用:(*参数名)->任意数量的参数。
def write_1(func): #闭包
print("runing write_1")
def inner(*args):
print("write a number,write_1")
return func(*args)
return inner
@write_1
def f1(a,b):
return a+b
r = f1(10,11)
print(r)
>>>
runing write_1
write a number,write_1
21
python中内置了一部分装饰器,有property、classmethod等,可到python库查阅。