文章目录
简介创建装饰器使用装饰器装饰函数(1)手工装饰器(2)语法糖装饰器
使用装饰器装饰类(1)手工装饰器(2)语法糖装饰器
实现累积装饰器(1)手工装饰器(2)语法糖装饰器
简介
在python程序中,可以使用装饰器给不同的函数或者类插入相同的功能。于其它高级语言相比,python不仅简化了装饰器代码,而且可以快速的实现所需要的功能。同时,装饰器在为函数或者类增加功能时变得十分透明。
创建装饰器
首先,一个装饰器简单来说就是一个函数(方法),只不过装饰器函数的参数必须是一个函数或者类。然后在装饰器函数中重新定义一个新的函数或类,并且在其中执行某些功能前后或中间来使用被装饰的函数或类,最后返回这个新定义的函数或类。
使用装饰器装饰函数
(1)手工装饰器
def decorate1(fun
):
def wrapper():
print("第一层装饰:原函数执行前的打印语句")
fun
()
print("第一层装饰:原函数执行后的打印语句")
return wrapper
def original_fun():
print("原函数内容")
original_fun
()
original_fun
=decorate1
(original_fun
)
original_fun
()
输出:
原函数内容
第一层装饰:原函数执行前的打印语句
原函数内容
第一层装饰:原函数执行后的打印语句
(2)语法糖装饰器
可使用特殊符号"@“来实现,使用”@装饰器名称"的形式将符号"@"放在函数或类的定义行之前
def decorate1(fun
):
def wrapper():
print("第一层装饰:原函数执行前的打印语句")
fun
()
print("第一层装饰:原函数执行后的打印语句")
return wrapper
@decorate1
def original_fun():
print("原函数内容")
original_fun
()
输出:
第一层装饰:原函数执行前的打印语句
原函数内容
第一层装饰:原函数执行后的打印语句
使用装饰器装饰类
与装饰器装饰函数类似,唯一区别就是装饰器内嵌函数改为内嵌类
(1)手工装饰器
def decorate1(fun
):
class wrapper():
def __init__(self
):
self
.wrapper
=original_class
()
def printf(self
):
print("原类执行前的打印语句")
self
.wrapper
.printf
()
print("原类执行后的打印语句")
return wrapper
class original_class:
def __init__(self
):
self
.text
="i am original_class"
def printf(self
):
print(self
.text
)
o_class
=decorate1
(original_class
)
o_class
().printf
()
输出:
原类执行前的打印语句
i am original_class
原类执行后的打印语句
(2)语法糖装饰器
def decorate1(fun
):
class wrapper():
def __init__(self
):
self
.wrapper
=fun
()
def printf(self
):
print("原类执行前的打印语句")
self
.wrapper
.printf
()
print("原类执行后的打印语句")
return wrapper
@decorate1
class original_class:
def __init__(self
):
self
.text
="i am original_class"
def printf(self
):
print(self
.text
)
if __name__
=="__main__":
ori
=original_class
()
ori
.printf
()
输出:
原类执行前的打印语句
i am original_class
原类执行后的打印语句
实现累积装饰器
(1)手工装饰器
def decorate1(fun
):
def wrapper():
print("第一层装饰:原函数执行前的打印语句")
fun
()
print("第一层装饰:原函数执行后的打印语句")
return wrapper
def decorate2(fun
):
def wrapper():
print("第二层装饰:原函数执行前的打印语句")
fun
()
print("第二层装饰:原函数执行后的打印语句")
return wrapper
def original_fun():
print("原函数内容")
original_fun
=decorate2
(decorate1
(original_fun
))
original_fun
()
输出:
第二层装饰:原函数执行前的打印语句
第一层装饰:原函数执行前的打印语句
原函数内容
第一层装饰:原函数执行后的打印语句
第二层装饰:原函数执行后的打印语句
(2)语法糖装饰器
def decorate1(fun
):
def wrapper():
print("第一层装饰:原函数执行前的打印语句")
fun
()
print("第一层装饰:原函数执行后的打印语句")
return wrapper
def decorate2(fun
):
def wrapper():
print("第二层装饰:原函数执行前的打印语句")
fun
()
print("第二层装饰:原函数执行后的打印语句")
return wrapper
@decorate2
@decorate1
def original_fun():
print("原函数内容")
original_fun
()
输出:
第二层装饰:原函数执行前的打印语句
第一层装饰:原函数执行前的打印语句
原函数内容
第一层装饰:原函数执行后的打印语句
第二层装饰:原函数执行后的打印语句