python装饰器详解
装饰器对初学python的学者来说,是个难点也是重点,下面我们一起看看,希望能帮到大家,个人理解,有误之处,希望提出。
- 装饰器的理解
- 简单的装饰
- 可以重用的装饰器
- *注入的装饰器
- 给原始函数添加参数的装饰器
- 添加多个装饰器
装饰器的理解
向一个现有的对象添加新的功能,同时又不改变其结构,也遵循面向对象开放封闭原则
简单的装饰
def showinfo():
print("显示个人信息")
def beforeshow(a):
print("显示之前。。。。")
a()
beforeshow(showinfo)
运行结果是:
显示之前。。。。
显示个人信息
已经完成在不改变原始代码的同时,添加新的功能。但是这种写法有不合理之处,还想在其他的函数上,添加额外的功能,则都需要扩展,所以代码重构成如下:
def showinfo1():
print("显示个人信息1")
def showinfo2():
print("显示个人信息2")
def updateshow(a):
def handlershow():
print("处理之前")
a()
print("处理之后")
return handlershow
u1 = updateshow(showinfo1)**#showinfo1 和 showinfo2函数可以随意更改**
u1()
可以用注入的方式来简化代码
def updateshow(a):
def handlershow():
print("处理之前")
a()
print("处理之后")
return handlershow
@updateshow
def showinfo1():
print("显示个人信息1")
@updateshow
def showinfo2():
print("显示个人信息2")
showinfo2()
给原始函数添加参数的装饰器
def updateshow(a):
def handlershow(*args,**kwargs):
print("处理之前")
a(*args,**kwargs)
print("处理之后")
return handlershow
@updateshow
def showinfo1(id,name,sex):
print("显示个人信息1")
@updateshow
def showinfo2(id):
print("显示个人信息2")
showinfo1(1,"a","男")
添加多个装饰器
def updateshow1(a):
def handlershow(*args,**kwargs):
print("处理之前1")
a(*args,**kwargs)
print("处理之后1")
return handlershow
def updateshow2(a):
def handlershow(*args,**kwargs):
print("处理之前2")
a(*args,**kwargs)
print("处理之后2")
return handlershow
@updateshow1
@updateshow2
def showinfo1(id,name,sex):
print("显示个人信息1")
@updateshow1
@updateshow2
def showinfo2(id):
print("显示个人信息2")
showinfo1(1,"a","男")