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

    xiaoxiao2022-07-07  205

    文章目录

    简介创建装饰器使用装饰器装饰函数(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)#此时原函数名指向内嵌函数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()

    输出:

    第二层装饰:原函数执行前的打印语句 第一层装饰:原函数执行前的打印语句 原函数内容 第一层装饰:原函数执行后的打印语句 第二层装饰:原函数执行后的打印语句
    最新回复(0)