Python装饰器:给函数或类增加功能

简介

在python程序中,可以使用装饰器给不同的函数或者类插入相同的功能。于其它高级语言相比,python不仅简化了装饰器代码,而且可以快速的实现所需要的功能。同时,装饰器在为函数或者类增加功能时变得十分透明。

创建装饰器

首先,一个装饰器简单来说就是一个函数(方法),只不过装饰器函数的参数必须是一个函数或者类。然后在装饰器函数中重新定义一个新的函数或类,并且在其中执行某些功能前后或中间来使用被装饰的函数或类,最后返回这个新定义的函数或类。

给小伙伴们推荐一个Python学习裙,里面的学习气氛也很好,热烈欢迎各位小伙伴的到来,大家在学习Python的过程中遇到了什么问题都可以一起探讨,不要在里面发广告哦!

610

380

249

使用装饰器装饰函数

(1)手工装饰器

def decorate1(fun):
def wrapper():
print("第一层装饰:原函数执行前的打印语句")
fun()
print("第一层装饰:原函数执行后的打印语句")
return wrapper
def original_fun():
print("原函数内容")
original_fun()#打印原来函数内容
original_fun=decorate1(original_fun)#此时原函数名指向内嵌函数wrapper,不再执行原函数
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()#保留一个original_class类对象
def printf(self):
print("原类执行前的打印语句")
self.wrapper.printf()#原始类original_class的一个对象,调用original_class类的实例方法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指向wrapper
o_class().printf()#实例化一个wrapper类对象执行wrapper类里的printf()方法

 

输出:

原类执行前的打印语句
i am original_class
原类执行后的打印语句

(2)语法糖装饰器

def decorate1(fun):
class wrapper():
def __init__(self):
self.wrapper=fun()#保留一个original_class类对象
def printf(self):
print("原类执行前的打印语句")
self.wrapper.printf()#原始类original_class的一个对象,调用original_class类的实例方法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不再指向原来的内存地址,而是指向decorate2函数的内嵌函数的wrapper()的地址
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()

输出:

第二层装饰:原函数执行前的打印语句
第一层装饰:原函数执行前的打印语句
原函数内容
第一层装饰:原函数执行后的打印语句
第二层装饰:原函数执行后的打印语句

 

posted @ 2021-02-02 15:30  兔兔有什么坏心思呢  阅读(411)  评论(0)    收藏  举报